2024 Clojure状态调查中分享您的想法!

欢迎!有关此功能的工作原理,请参阅关于页面获取更多信息。

0
编译器

try语句静默地接受同一个类的多个catch子句,但只有第一个会被调用

user=> (try (/ 1 0) (catch Exception _ (println "a")) (catch Exception _ (println "b"))) a nil

2 答案

0

评论者:schmee

我已经附上一个补丁,该补丁通过使Clojure的try/catch语义与Java更一致来修复此问题。对于每个catch子句,编译器检查之前的catch子句是否是当前子句的子类。如果是,则抛出IllegalArgumentException。这在catch子句的数量上是O(n^2),但由于n在绝大多数情况下将很低,并且这项工作是在解析时完成的,因此不应带来任何性能问题。

由于此补丁不再允许使用此补丁尝试多个捕获,我不得不修改一个无关的测试。

0
参考:https://clojure.atlassian.net/browse/CLJ-2181(由 alex+import 报告)
...