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)

此补丁比 my patch for CLJS 更宽容:CLJS 补丁确保:default 捕获块在非默认捕获块和最终块(如果存在)之间发生。此补丁使(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

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

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

0

评论者:bendlas

我支持捕获Exception。它在java中是默认的(如文档所述),所以捕获Throwable是一个特定平台的做法,但这仍然可能。

0

评论者:bendlas

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

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

0

评论者:bendlas

意识到,捕获所有与捕获Exception之间只是一种表面上的矛盾:(catch Exception _) 在所有意义上 - 是java的捕获所有。由于可以通过常规的捕获访问捕获所有,clojurescript中的主要需求并不适用于clojure。clojure中的主要需求是可移植性。在clojurescript中,这被混同于暴露一个在其他情况下不可访问的平台特性,但这不应该推动总体设计。

附加v003

...