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")))

;; 不打印任何内容
(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报告)
...