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

欢迎!请查阅关于页面以了解更多关于该系统的工作方式的信息。

0投票
core.async

ClojureScript中,如果在一个“go”块的“try”包围中抛出一个字符串,则“finally”将被忽略。

示例代码

(ns demo
(:require-macros
(link: cljs.core.async.macros :refer [go]))

;; 输出: "in a finally"
(go (try (throw (ex-info "THROWN" nil)) (finally (println "in a finally"))))

;; 输出: "in a finally"
(go (try (throw (js/Exception. "THROWN")) (finally (println "in a finally"))))

;; 输出: "in a finally"
(go (try (throw (#js {})) (finally (println "in a finally"))))

;; 输出: "in a finally"
(try (throw "THROWN") (finally (println "in a finally")))

;; 输出: nothing
(go (try (throw "THROWN") (finally (println "in a finally"))))

5 答案

0投票

评论由:hubert 发布

还有其他情况同样失败
org.clojure/clojure "1.8.0"
org.clojure/clojurescript "1.9.671"
org.clojure/core.async "0.3.443"

0投票

评论由:hiredman 发布

问题可能出现在https://github.com/clojure/core.async/blob/17112aca9b07ebba6ce760ca01d117c24c80cc9a/src/main/clojure/cljs/core/async/impl/ioc_macros.clj#L861

如果是这种情况,您将看到当抛出的东西没有被js/Object捕获时(我知道字符串和数字就是这样,不确定还有什么),这种情况不会是“finally”被忽略,而是“go”块的状态机完全未能处理抛出的东西,并完全失败的。

0投票

评论由:hubert 发布

抱歉出现拼写错误。正确的标题应该是:
(CLJS) 在“go”块中的“try”内的“finally”部分如果发生字符串异常会被跳过。

0投票

评论由:hiredman 发布

https://dev.clojure.org/jira/browse/ASYNC-184 的补丁中,通过在宏展开中将 (catch js/Object ...) 替换为 (catch :default ...) 来解决这个问题。

0投票
参考资料: https://clojure.atlassian.net/browse/ASYNC-200 (由 alex+import 报告)
...