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

欢迎!请参阅关于页面以了解更多关于如何使用这个网站的信息。

+8
Clojure

ClojureScript 有此特性以公开未类型化的异常捕获,这在 Java 中相当于 (catch Throwable _)

http://dev.clojure.org/jira/browse/CLJS-661

提案

1) 添加 (catch :default ) 以表示 (catch Throwable )
2) 添加 (catch :default ) 以表示 (catch Exception )
3) 添加 (catch :all ) 以表示 (catch Throwable )

请参阅设计页面以讨论提案: http://dev.clojure.org/display/design/Platform Errors

补丁

v001仅实现了1)

此补丁比我对 CLJS 的补丁更宽容:CLJS 补丁确保了非默认的异常捕获块和最后的块(如果存在)之间,此补丁仅将 (catch :default ...) 作为 (catch Throwable ...) 的同义词。我希望将编译器的更改保持最小。

开放问题:捕获 Throwable(补丁 v001 实现了这一点)或 Exception?或者是一个更精心的“非致命”错误列表。参见 Scala 的 NonFatal 模式提取器: https://scala-lang.org.cn/api/current/scala/util/control/NonFatal$.html

v002实现了2) + 3)

此版本基于v001,因此关于条款顺序的注意事项同样适用。

v003仅实现了2)

此版本基于v001,因此关于条款顺序的注意事项同样适用。

6 答案

+1
参考:https://clojure.atlassian.net/browse/CLJ-1293(由 bbloom 报告)
0

评论由:bbloom 提供

注意到这个(错误级别)从“次要”更改为“严重”,所以我应该提一下,我后来意识到我们可能想要default争取捕获Exception而不是Throwable,这样就可以避免捕获Error子类。Javadocs说:“Error是Throwable的子类,它指示了应用程序应该避免尝试捕获的严重问题。”如果这正是我们想要的,我可以提供更新的补丁。

0

评论者:alexmiller

这似乎是一个悬而未决的问题,最好在描述中将其列出。

我并不期望现在在门票或补丁上达成共识,只是试图更新优先级并增加与Rich讨论的可见性,一旦我们到达1.8。

0

评论者:bendlas

我赞成捕获Exception。它就是Java中的default(正如文档所述),因此捕获Throwable是特定平台的操作,但仍然可以进行。

0

评论者:bendlas

嗯,现在意识到,我上一条评论与关于能够在javascript中捕获任何内容的讨论相矛盾。

附加的补丁v002实现了除default之外的所有功能。

0

评论者:bendlas

意识到,捕获所有与捕获Exception之间只有一层矛盾:(catch Exception _)在所有情况下都是Java的捕获所有。由于可以通过常规的catch在Java中访问捕获所有,因此Clojure的需求并不适用于ClojureScript。Clojure的需求在于可移植性。在ClojureScript中,这被混淆为解释一个在其他情况下无法访问的平台功能,但这一点不应该驱动一般的设计。

附加v003

...