请参与2024年Clojure调查,分享您的观点!2024 State of Clojure Survey!

欢迎!请参阅关于页面了解更多信息关于本站的工作方式。

+8
Clojure

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

补丁

v001 仅实现 1)

此补丁比我在 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

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

看起来这是一个悬而未决的问题,最好在描述中将其列为问题。

我并不期待在这个问题或补丁上立即达成共识,只是在尝试更新优先级并提高讨论的可见性,一旦我们达到 1.8。

0

评论者:bendlas

我支持捕获 Exception。这在 Java 中是 :default(如文档所述),所以捕获 Throwable 是平台特定的事情,但仍可行。

0

评论者:bendlas

嗯,我现在意识到,我之前的评论与关于在 JavaScript 中捕获任何内容的设 计讨论相矛盾。

附加的补丁 版本 v002 实现了 :all,除了 :default。

0

评论者:bendlas

我意识到,catch-all 与 catch-Exception 只是一种浅层次的矛盾:(catch Exception _)对所有目的而言是 Java 中的 catch-all。由于可以通过常规的 catch 访问 catch-absolutely-all,因此 ClojureScript 中推动的需求不适用于 Clojure。Clojure 的驱动需求是可移植性。在 Clojurescript 中,这被混同为公开一个其他情况下无法访问的平台特定功能,但这不能成为一般设计的推动因素。

附加 v003

...