在 ClojureScript 中,`go` 块内的 `(catch :default e ...) ` 会因为非 `js/Error` 类型的错误而失败。也就是说,抛出一个数字、字符串等都会失败(尽管这种情况很少见,但仍然存在)。我在将 Slingshot (scgilardi/slingshot) 迁移到 CLJS 时遇到了这个问题。
以下是一些测试用例
`
(defn test0
"打印 'Error: nil'。"
(link: )
(go (println "Error:"
(<! (go (throw (js/Error.)))))))
(defn test1
"打印 'Error: #object(link: Error Error)'。"
(link: )
(go (println "Error:"
(<! (go (try (throw (js/Error.))
(catch :default e e)))))))
(defn test2
"除了控制台错误信息外不打印任何内容
msg. Chrome 显示 'Uncaught 123'。"
(link: )
(go (println "Error:"
(<! (go (try (throw 123)
(catch :default e e)))))))
`
test2
应该打印 'Error: 123',但没有打印。
(作为一个备注,`test0` 是否应该像抛出 js/Error 一样返回错误,而不是在控制台打印未捕获的错误并返回 nil?)