欢迎!请参阅关于页面获取更多有关如何使用本网站的详细信息。
Clojurescript提供了以下代码来公开未类型化的catch,这在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块位于非默认的catch块和finally块之间(如果存在)。此补丁仅将(catch :default ...)视为(catch Throwable ...)。我希望将编译器的更改保持到最小。
开放问题:捕获 Throwable(补丁v001实现了此功能)或Exception?另请参见更精心设计的“非致命”错误列表。参阅Scala的NonFatal模式提取器:https://scala-lang.org.cn/api/current/scala/util/control/NonFatal$.html
此版本基于v001,因此同样适用于条款订单的注意事项。
由 bbloom 发表的评论:
注意到这个问题已经从“次要”变为“关键”,所以我应该提一下,我后来意识到我们可能希望默认捕获 Exception 而不是 Throwable,以避免捕获错误子类。JavaDoc 说:“Error 是 Throwable 的子类,表示应用应该避免尝试捕获的严重问题。”如果我们真的想这样做,我可以提供一个更新的补丁。
由 alexmiller 发表的评论:
这看起来是一个悬而未决的问题,最好在描述中将其列出。
我并不期望在现在就达成关于工单或补丁的共识,只是在尝试更新优先级,并在达到 1.8 后与 Rich 进行讨论。
由 bendlas 发表的评论:
我赞成捕获 Exception。它是 java(如文档所述)的 :default,因此捕获 Throwable 是一个与平台相关的事情,但这仍然可能做到。
嗯,现在意识到,我的最后一个评论与关于在 JavaScript 中能够捕获任何东西的设计讨论相矛盾。
附带的补丁 v002 实现了 :all,除了 :default。
意识到,捕获全部与捕获 Exception 之间的矛盾只是表面的:((catch Exception _) 对 Java 来说 - 在所有意义上 - 是捕获全部)。因为可以通过常规的 catch 在 Java 中访问 capture-absolutely-all,所以在 ClojureScript 中的主要需求并不适用于 Clojure。Clojure 中的主要需求是可移植性。在 ClojureScript 中,这被混淆为暴露一个在其他情况下无法访问的平台功能,但这不应该推动一般设计。
附带的 v003