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

欢迎!请参阅 关于 页面以获取更多关于此功能的信息。

0
core.async

在ClojureScript中,如果在“go”块中的“try”中抛出字符串,则“finally”会被忽略。

示例代码

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

;; 打印: "在finally中"
(go (try (throw (ex-info "THROWN" nil)) (finally (println "在finally中"))))

;; 打印: "在finally中"
(go (try (throw (js/Exception. "THROWN")) (finally (println "在finally中"))))

;; 打印: "在finally中"
(go (try (throw (#js {})) (finally (println "在finally中"))))

;; 打印: "在finally中"
(try (throw "THROWN") (finally (println "在finally中")))

;; 打印: 无
(go (try (throw "THROWN") (finally (println "在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 报告)
...