欢迎!请参阅关于页面以了解更多关于如何使用这个网站的信息。
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
此补丁比我对 CLJS 的补丁更宽容:CLJS 补丁确保了非默认的异常捕获块和最后的块(如果存在)之间,此补丁仅将 (catch :default ...) 作为 (catch Throwable ...) 的同义词。我希望将编译器的更改保持最小。
开放问题:捕获 Throwable(补丁 v001 实现了这一点)或 Exception?或者是一个更精心的“非致命”错误列表。参见 Scala 的 NonFatal 模式提取器: https://scala-lang.org.cn/api/current/scala/util/control/NonFatal$.html
此版本基于v001,因此关于条款顺序的注意事项同样适用。
评论由:bbloom 提供
注意到这个(错误级别)从“次要”更改为“严重”,所以我应该提一下,我后来意识到我们可能想要default争取捕获Exception而不是Throwable,这样就可以避免捕获Error子类。Javadocs说:“Error是Throwable的子类,它指示了应用程序应该避免尝试捕获的严重问题。”如果这正是我们想要的,我可以提供更新的补丁。
评论者:alexmiller
这似乎是一个悬而未决的问题,最好在描述中将其列出。
我并不期望现在在门票或补丁上达成共识,只是试图更新优先级并增加与Rich讨论的可见性,一旦我们到达1.8。
评论者:bendlas
我赞成捕获Exception。它就是Java中的default(正如文档所述),因此捕获Throwable是特定平台的操作,但仍然可以进行。
嗯,现在意识到,我上一条评论与关于能够在javascript中捕获任何内容的讨论相矛盾。
附加的补丁v002实现了除default之外的所有功能。
意识到,捕获所有与捕获Exception之间只有一层矛盾:(catch Exception _)在所有情况下都是Java的捕获所有。由于可以通过常规的catch在Java中访问捕获所有,因此Clojure的需求并不适用于ClojureScript。Clojure的需求在于可移植性。在ClojureScript中,这被混淆为解释一个在其他情况下无法访问的平台功能,但这一点不应该驱动一般的设计。
附加v003