Как поймать исключение Javascript в Clojurescript?
В моем слое связи у меня есть необходимость улавливать ЛЮБОЕ исключение javascript, записывать его и продолжать, как я обычно делал.
Текущий синтаксис для улавливания исключений в Clojurescript диктует, что мне нужно указать тип исключаемого исключения.
Я попытался использовать nil, js/Error, js/object в форме catch и не улавливает ЛЮБОЕ исключение javascript (которое может содержать строку как тип объекта).
Я был бы признателен за любые намеки, как это можно сделать изначально в Clojurescript.
Ответы
Ответ 1
Я нашел еще один возможный ответ в David Nolen "Учебник Light 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))
Ответ 2
Похоже, что 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"
В этом последнем случае карта создает ленивую последовательность, и функция try возвращает ее. Затем, когда repl пытается распечатать последовательность на консоли, она вычисляется, и ошибка выводится за пределы выражения try.
Ответ 3
Я думаю, что только что нашел решение в этой ссылке
https://groups.google.com/forum/#!topic/clojure/QHaTwjD4zzU
Я копирую содержимое здесь:
Это решение было опубликовано Herwig Hochleitner
попробуйте в clojurescript на самом деле макрос, который использует встроенный 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
)
)
)
Я надеюсь, что это поможет вам
Juan