2012-09-29 20 views
14

En mi capa de comunicación, tengo la necesidad de poder detectar CUALQUIER excepción de JavaScript, cerrarla y proceder como lo haría normalmente. La sintaxis actual para capturar excepciones en Clojurescript dicta que necesito especificar el tipo de excepción que se captura.¿Cómo atrapar cualquier excepción de Javascript en Clojurescript?

Intenté usar nil, js/Error, js/object en el formulario de captura y no captura CUALQUIER excepción de JavaScript (que puede tener cadena como el tipo de objeto).

Agradecería cualquier sugerencia de cómo se puede hacer de forma nativa en Clojurescript.

+0

Hola Dima ! ¿Crees que mi respuesta soluciona tu problema? – tangrammer

Respuesta

5

Parece que js/Objeto todas las capturas (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 secuencias perezosos. Si se produce un error en una secuencia perezosa, es posible que parte del código no se ejecute hasta 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, un mapa crea una secuencia perezoso y la función intento devuelve. Luego, cuando el repl intenta imprimir la secuencia a la consola, se evalúa y se arroja el error fuera de la expresión de prueba.

+0

usted puede atraparlos con ': default' también, que es probablemente más idiomático – olieidel

3

Creo que sólo he encontrado la solución en este enlace https://groups.google.com/forum/#!topic/clojure/QHaTwjD4zzU

copio el contenido aquí: Esta solución fue publicada por Herwig Hochleitner

intento en clojurescript es en realidad una macro que usa el intento integrado try * y agrega el envío de tipo. Entonces, para atrapar todo, solo use (intente * ... (capture e ...)). Esto se asigna directamente a la prueba de JavaScript.

Y aquí está funcionando mi aplicación 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 le ayuda
Juan

+0

try * ahora está en desuso. Use el: predeterminado como en su otra respuesta – johnbakers

33

he encontrado otra respuesta posible 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)) 
+0

Esta es ahora la forma correcta de hacerlo. – johnbakers

+0

': default' no existe actualmente en Clojure" regular "(basado en Java), pero hay una propuesta para agregarlo a eso también: http://dev.clojure.org/jira/browse/CLJ-1293 –

Cuestiones relacionadas