28

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

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

我将不胜感激任何提示如何在 Clojurescript 中本地完成此操作。

4

3 回答 3

53

我在 David Nolen “Light Table ClojureScript Tutorial”中找到了另一个可能的答案

;; 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))
于 2014-01-17T10:34:27.647 回答
5

看起来 js/Object 捕获了它们(在https://himera.herokuapp.com上测试):

cljs.user> (try (throw (js/Error. "some error")) (catch js/Object e (str "Caught: " e)))
"Caught: Error: some error"
cljs.user> (try (throw "string error") (catch js/Object e (str "Caught: " e)))
"Caught: string error"
cljs.user> (try (js/eval "throw 'js error';") (catch js/Object e (str "Caught: " e)))
"Caught: js error"

需要注意的一件事是惰性序​​列。如果在惰性序列中抛出错误,则在退出 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 表达式之外。

于 2013-02-28T17:26:48.040 回答
4

我想我刚刚在此链接 https://groups.google.com/forum/#!topic/clojure/QHaTwjD4zzU中找到了解决方案

我在此处复制内容:此解决方案由 Herwig Hochleitner 发布

clojurescript 中的 try 实际上是一个使用内置 try* 并添加类型调度的宏。因此,要捕获所有内容,只需使用 (try* ... (catch 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
      )
    )
  )

希望对你
有所帮助

于 2013-09-11T15:24:21.427 回答