欢迎!请参阅关于页面了解更多信息关于本站的工作方式。
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 块在 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 子类。Javadocs 中提到:“Error 是 Throwable 的一个子类,它表示一个合理的应用程序不应尝试捕获的严重问题。”如果这正是我们想要的,我可以提供更新后的补丁。
评论者:alexmiller
看起来这是一个悬而未决的问题,最好在描述中将其列为问题。
我并不期待在这个问题或补丁上立即达成共识,只是在尝试更新优先级并提高讨论的可见性,一旦我们达到 1.8。
评论者:bendlas
我支持捕获 Exception。这在 Java 中是 :default(如文档所述),所以捕获 Throwable 是平台特定的事情,但仍可行。
嗯,我现在意识到,我之前的评论与关于在 JavaScript 中捕获任何内容的设 计讨论相矛盾。
附加的补丁 版本 v002 实现了 :all,除了 :default。
我意识到,catch-all 与 catch-Exception 只是一种浅层次的矛盾:(catch Exception _)对所有目的而言是 Java 中的 catch-all。由于可以通过常规的 catch 访问 catch-absolutely-all,因此 ClojureScript 中推动的需求不适用于 Clojure。Clojure 的驱动需求是可移植性。在 Clojurescript 中,这被混同为公开一个其他情况下无法访问的平台特定功能,但这不能成为一般设计的推动因素。
附加 v003