2011-02-05 13 views
5

Nel codice seguente, Clojure (1.2) è la stampa il messaggio sbagliato:Clojure non cattura NumberFormatException

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

Questo dovrebbe stampare "argomento illegale", ma invece viene stampato un (1#<NumberFormatException java.lang.NumberFormatException: For input string: "a">.

Cosa sto sbagliando?

Ciò è dovuto alla sequenza lenta restituita da map? Come dovrebbe essere scritto?

+2

Questo dovrebbe essere utile: http://groups.google.com/group/clojure/msg/f4ea5a9c38f4d991 – MayDaniel

risposta

10

Il modulo speciale try rileva solo eccezioni generate durante l'estensione dinamica del codice corpo. Qui map restituisce una sequenza lenta, che quindi viene esclusa dal modulo speciale try e restituita. La stampante valuta quindi la sequenza e a quel punto viene generata l'eccezione.

Avvolgere il map in doall dovrebbe risolvere il problema.

+1

In realtà l'ho provato. Sembra ancora restituire una NFE avvolta in una RuntimeException. – Ralph

+1

@ Ralph: meno di 1,3 funziona. È possibile avvolgere la chiamata parseInt con try e restituire un valore ragionevole se si verifica un'eccezione. Se ciò non è appropriato, è possibile restituire nil quando si verifica un'eccezione e verificare se la sequenza risultante contiene zero per determinare se si è verificata un'eccezione e quindi agire in modo appropriato. – Brian

+0

Il secondo suggerimento (return 'nil') sembra ragionevole. Lo controllerò. – Ralph

Problemi correlati