Error handling 如何在Clojurescript中捕获任何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可以捕获所有这些提示(在上测试): 要注意的一件事是懒惰的序列。如

在我的通信层中,我需要能够捕获任何javascript异常,将其记录下来,然后像平常一样继续。 Clojurescript中捕获异常的当前语法规定我需要指定捕获的异常的类型

我尝试在catch表单中使用nil、js/Error、js/object,但它没有捕获任何javascript异常(可以将字符串作为对象的类型)


如果您能在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))