在我的通信层中,我需要能够捕获任何 javascript 异常,将其记录下来并像往常一样继续。在 Clojurescript 中捕获异常的当前语法要求我需要指定被捕获的异常的类型。
我尝试在 catch 表单中使用 nil、js/Error、js/object 并且它没有捕获任何 javascript 异常(可以将字符串作为对象的类型)。
我将不胜感激任何提示如何在 Clojurescript 中本地完成此操作。
在我的通信层中,我需要能够捕获任何 javascript 异常,将其记录下来并像往常一样继续。在 Clojurescript 中捕获异常的当前语法要求我需要指定被捕获的异常的类型。
我尝试在 catch 表单中使用 nil、js/Error、js/object 并且它没有捕获任何 javascript 异常(可以将字符串作为对象的类型)。
我将不胜感激任何提示如何在 Clojurescript 中本地完成此操作。
我在 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))
看起来 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 表达式之外。
我想我刚刚在此链接 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
)
)
)
希望对你
有所帮助