Error handling 如何在Clojurescript中捕获任何Javascript异常?
在我的通信层中,我需要能够捕获任何javascript异常,将其记录下来,然后像平常一样继续。 Clojurescript中捕获异常的当前语法规定我需要指定捕获的异常的类型 我尝试在catch表单中使用nil、js/Error、js/object,但它没有捕获任何javascript异常(可以将字符串作为对象的类型)Error handling 如何在Clojurescript中捕获任何Javascript异常?,error-handling,interop,clojurescript,swallowed-exceptions,Error Handling,Interop,Clojurescript,Swallowed Exceptions,在我的通信层中,我需要能够捕获任何javascript异常,将其记录下来,然后像平常一样继续。 Clojurescript中捕获异常的当前语法规定我需要指定捕获的异常的类型 我尝试在catch表单中使用nil、js/Error、js/object,但它没有捕获任何javascript异常(可以将字符串作为对象的类型) 如果您能在Clojurescript中提供如何在本机上完成此操作的任何提示,我将不胜感激。看起来js/Object可以捕获所有这些提示(在上测试): 要注意的一件事是懒惰的序列。如
如果您能在Clojurescript中提供如何在本机上完成此操作的任何提示,我将不胜感激。看起来js/Object可以捕获所有这些提示(在上测试): 要注意的一件事是懒惰的序列。如果在延迟序列中抛出错误,则在退出try函数之前可能不会执行部分代码。例如:
cljs.user> (try (map #(if (zero? %) (throw "some error")) [1]))
(nil)
cljs.user> (try (map #(if (zero? %) (throw "some error")) [0]))
; script fails with "Uncaught some error"
在最后一种情况下,map创建一个惰性序列,try函数返回它。然后,当repl尝试将序列打印到控制台时,它将被计算,错误将抛出try表达式之外。我想我刚刚在这个链接中找到了解决方案 我在这里复制内容: 该解决方案由Herwig Hochleitner发布 try-in-clojurescript实际上是一个使用内置try的宏* 并添加类型分派。所以要抓住一切,只需使用(尝试*。。。 (第e条……)。这直接映射到javascript的尝试 以下是我正在实施的:
(defn is-dir? [the_dir]
(try*
(if-let [stat (.statSync fs the_dir )]
(.isDirectory stat)
false)
(catch e
(println "catching all exceptions, include js/exeptions")
false
)
)
)
我希望它能帮助你胡安我在大卫·诺伦身上找到了另一个可能的答案
嗨,迪玛!您认为我的回答可以解决您的问题吗?try*现在已不推荐使用。在其他答案中使用:default这是正确的方法。
:default
目前在“常规”(基于Java的)Clojure中不存在,但也有一个建议将其添加到该选项中:?(:cljs:default:clj Throwable)
而不是:default
将适用于clj和cljs,在cljc文件中,您也可以使用:default
捕获它们,这可能更为惯用
(defn is-dir? [the_dir]
(try*
(if-let [stat (.statSync fs the_dir )]
(.isDirectory stat)
false)
(catch e
(println "catching all exceptions, include js/exeptions")
false
)
)
)
;; Error Handling
;; ============================================================================
;; Error handling in ClojureScript is relatively straightforward and more or
;; less similar to what is offered in JavaScript.
;; You can construct an error like this.
(js/Error. "Oops")
;; You can throw an error like this.
(throw (js/Error. "Oops"))
;; You can catch an error like this.
(try
(throw (js/Error. "Oops"))
(catch js/Error e
e))
;; JavaScript unfortunately allows you to throw anything. You can handle
;; this in ClojureScript with the following.
(try
(throw (js/Error. "Oops"))
(catch :default e
e))