Подтвердить что ты не робот

Как поймать исключение Javascript в Clojurescript?

В моем слое связи у меня есть необходимость улавливать ЛЮБОЕ исключение javascript, записывать его и продолжать, как я обычно делал. Текущий синтаксис для улавливания исключений в Clojurescript диктует, что мне нужно указать тип исключаемого исключения.

Я попытался использовать nil, js/Error, js/object в форме catch и не улавливает ЛЮБОЕ исключение javascript (которое может содержать строку как тип объекта).

Я был бы признателен за любые намеки, как это можно сделать изначально в Clojurescript.

4b9b3361

Ответ 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