请在 2024 年 Clojure 调查中分享您的想法!

欢迎!请参阅 关于 页面了解更多关于这是如何工作的信息。

+8
Clojure

Clojurescript 使用此来实现无类型捕获,这相当于 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 补丁确保 :default 捕获块位于非默认捕获块和如果有则的 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 子类。Javadoc 里说:“Error 是 Throwable 的子类,表示合理的应用程序不应该尝试捕获的严重问题。”如果我们确实想要这样,我可以提供一个更新的补丁。

0

评论者:alexmiller

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

我并不期望现在就在票据或补丁上达成共识,只是尝试更新优先级并在达到 1.8 之后与 Rich 进行讨论。

0

评论者:bendlas

我赞同捕获 Exception。它是 java 中的 :default(如文档中所述),因此捕获 Throwable 是特定平台的操作,但这仍然是可能的。

0

评论者:bendlas

嗯,我现在意识到,我最后的评论与关于能够在 JavaScript 中捕获任何内容的讨论相矛盾。

附加的补丁 v002 实现了 :all 和 :default。

0

评论者:bendlas

我意识到,catch-all 与 catch-Exception 之间的矛盾仅仅是肤浅的:在所有意义上 -(catch Exception _) 实际上是 Java 的 catch-all。由于在 Java 中可以通过常规的 catch 访问捕获所有内容,所以 clojurescript 中的基本需求不适用于 clojure。clojure 的基本需求是可移植性。在 clojurescript 中,这被误解为暴露了本应不可访问的平台功能,但这不应该成为共同努力的驱动力。

附加 v003

...