欢迎!请参见关于页面了解更多此平台的工作原理。
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 补丁确保 :default 捕获块位于非默认捕获块和可选的 finally 块之间。此补丁仅将 (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 子类。Java 文档中说:“Error 是 Throwable 的一个子类,它表示合理的应用程序不应该尝试捕获的严重问题。”如果这正是我们想要的,我可以提供一个更新的补丁。
评论者:alexmiller
看起来这是一个悬而未决的问题,最好是将其列入描述中。
我不太期望现在就能在工单或补丁上达成共识,只是尝试更新优先级,并在到达 1.8 后与 Rich 进行讨论。
评论者:bendlas
我倾向于捕获 Exception。在 Java 中,这由文档所述的:default 实现,因此捕获 Throwable 是一个特定于平台的行为,并且仍然可以进行。
嗯,现在我意识到,我最后的评论与关于能够捕获 JavaScript 中任何内容的讨论相矛盾。
附上的 v002 补丁实现了:all,除了:default。
意识到,捕获所有 vs 捕获 Exception 只是一个表面的矛盾:(catch Exception _)对于所有目的而言——是 Java 中的捕获所有。由于在 Java 中可以通过常规的 catch 访问捕获所有,所以 clojurescript 中的驱动需求不适用于 clojure。clojure 中的驱动需求是便携性。在 clojurescript 中,这与透露一个本应不可访问的平台功能相混淆,但这不能驱使总体设计。
附上的 v003