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异常。这在大多数情况下n的值都较低时,且工作在解析时间完成时,它不会引起任何性能问题。

我不得不修改一个与之无关的测试,因为这个测试实际上有多个catch子句,它们都捕获了{{Exception}},而在这个补丁中不再允许这样做。

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