error handling - nodejs - ¿Cómo capturar cualquier excepción de Javascript en Clojurescript?
try catch javascript ejemplo (3)
Creo que acabo de encontrar la solución en este enlace https://groups.google.com/forum/#!topic/clojure/QHaTwjD4zzU
Aquí copio el contenido: Esta solución fue publicada por Herwig Hochleitner.
try in clojurescript es en realidad una macro que usa el try * integrado y agrega el tipo de envío. Entonces, para capturar todo, simplemente use (intente * ... (atrape e ...)). Esto se mapea directamente al intento de javascript.
Y aquí está mi implementación trabajando ahora:
(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
)
)
)
Espero que te ayude
Juan
En mi capa de comunicación tengo la necesidad de poder detectar CUALQUIER excepción de javascript, cerrar sesión y proceder como lo haría normalmente. La sintaxis actual para detectar excepciones en Clojurescript dicta que debo especificar el tipo de excepción que se detectó.
Intenté usar nil, js / Error, js / object en el formulario catch y no captura NINGUNA excepción de javascript (que puede tener una cadena como tipo de objeto).
Agradecería cualquier sugerencia de cómo esto se puede hacer de forma nativa en Clojurescript.
Encontré otra posible respuesta en 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))
Parece que js / Object los atrapa a todos (probado en 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"
Una cosa a tener en cuenta es las secuencias perezosas. Si se produce un error en una secuencia perezosa, es posible que parte del código no se ejecute hasta después de que haya salido de la función de prueba. Por ejemplo:
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"
En ese último caso, el mapa crea una secuencia perezosa y la función try la devuelve. Luego, cuando la respuesta intenta imprimir la secuencia en la consola, se evalúa y el error se lanza fuera de la expresión de prueba.