2011-02-05 11 views
5

En el siguiente código, Clojure (1.2) está imprimiendo el mensaje equivocado:Clojure no captura NumberFormatException

(try 
    (let [value "1,a"] 
    (map #(Integer/parseInt %) (.split value ","))) 
    (catch NumberFormatException _ (println "illegal argument"))) 

Esto debería imprimir "argumento incorrecto", pero en su lugar se imprime una (1#<NumberFormatException java.lang.NumberFormatException: For input string: "a">.

¿Qué estoy haciendo mal?

¿Esto se debe a la secuencia diferida devuelta por map? ¿Cómo debería escribirse?

+2

Debería encontrar esto útil: http://groups.google.com/group/clojure/msg/f4ea5a9c38f4d991 – MayDaniel

Respuesta

10

La forma especial try solo capta las excepciones que se producen durante la extensión dinámica del código de cuerpo. Aquí map está devolviendo una secuencia floja, que luego se pasa del formulario especial try y se devuelve. La impresora luego evalúa la secuencia, y en ese punto se lanza la excepción.

Envolviendo el map en doall debería solucionar su problema.

+1

De hecho, lo intenté. Todavía parece devolver un NFE envuelto en una RuntimeException. – Ralph

+1

@Ralph: debajo de 1.3 funciona. Puede envolver la llamada parseInt con try y devolver algún valor razonable si ocurre una excepción. Si eso no es apropiado, puede devolver cero cuando se produce una excepción y verificar si la secuencia resultante contiene cero para determinar si se produjo una excepción y luego actuar de manera adecuada. – Brian

+0

La segunda sugerencia (return 'nil') parece razonable. Lo comprobaré. – Ralph

Cuestiones relacionadas