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

欢迎!有关如何使用本平台的更多信息,请参阅关于页面。

0
core.async

在 ClojureScript 中,如果抛出字符串并在“try”的封装“go”块中,则会忽略“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")))

;; 输出:无
(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 捕获的内容出现此行为(我知道字符串和数字是这种情况,不确定其他还有什么)。这并不是最后被跳过,而是 go 块的状态机完全未能处理抛出的事物,并完全退出。

0

评论者:hubert

抱歉出现拼写错误,正确的标题应该是
(CLJS) 在“go”块中的“try”中的“finally”如果在“string”中抛出将会被跳过。

0

评论者:hiredman

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

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