请参与2024年度Clojure调查,分享您的想法!https://www.surveymonkey.com/r/clojure2024

欢迎!请参阅关于页面获取更多有关如何使用本网站的详细信息。

+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块位于非默认的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 发表的评论:

注意到这个问题已经从“次要”变为“关键”,所以我应该提一下,我后来意识到我们可能希望默认捕获 Exception 而不是 Throwable,以避免捕获错误子类。JavaDoc 说:“Error 是 Throwable 的子类,表示应用应该避免尝试捕获的严重问题。”如果我们真的想这样做,我可以提供一个更新的补丁。

0

由 alexmiller 发表的评论:

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

我并不期望在现在就达成关于工单或补丁的共识,只是在尝试更新优先级,并在达到 1.8 后与 Rich 进行讨论。

0

由 bendlas 发表的评论:

我赞成捕获 Exception。它是 java(如文档所述)的 :default,因此捕获 Throwable 是一个与平台相关的事情,但这仍然可能做到。

0

由 bendlas 发表的评论:

嗯,现在意识到,我的最后一个评论与关于在 JavaScript 中能够捕获任何东西的设计讨论相矛盾。

附带的补丁 v002 实现了 :all,除了 :default。

0

由 bendlas 发表的评论:

意识到,捕获全部与捕获 Exception 之间的矛盾只是表面的:((catch Exception _) 对 Java 来说 - 在所有意义上 - 是捕获全部)。因为可以通过常规的 catch 在 Java 中访问 capture-absolutely-all,所以在 ClojureScript 中的主要需求并不适用于 Clojure。Clojure 中的主要需求是可移植性。在 ClojureScript 中,这被混淆为暴露一个在其他情况下无法访问的平台功能,但这不应该推动一般设计。

附带的 v003

...