在 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 表示 '未捕获 123'。"
(link: )
(go (println "Error:"))
(<! (go (try (throw 123)
(catch :default e e)))))))
`
`test2` 应该打印 'Error: 123',但没有。
(作为旁注,`test0` 不应该返回抛出的 js/Error,而是应该返回控制台中的未捕获错误并返回 nil?)