2011-02-05 10 views
5

w poniższym kodzie, Clojure (1,2) drukuje złą wiadomość:Clojure nie łapania NumberFormatException

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

ten powinien wydrukować „nielegalne argument”, ale zamiast tego drukuje (1#<NumberFormatException java.lang.NumberFormatException: For input string: "a">.

Co robię źle?

Czy to z powodu leniwej sekwencji zwróconej przez map? Jak to powinno być napisane?

+2

Powinieneś znaleźć pomocne: http://groups.google.com/group/clojure/msg/f4ea5a9c38f4d991 – MayDaniel

Odpowiedz

10

Specjalny formularz o numerzewychwytuje wyjątki, które powstają w trakcie dynamicznego zakresu kodu ciała. Tutaj map powraca leniwą sekwencję, która następnie jest przekazywana ze specjalnego formularza i zwracana. Następnie drukarka ocenia sekwencję i w tym momencie generowany jest wyjątek.

Zawijanie map w doall powinno rozwiązać problem.

+1

Tak naprawdę to wypróbowałem. Nadal wydaje się zwracać NFE owinięty w wyjątek RuntimeException. – Ralph

+1

@Ralph: Under 1.3 to działa. Możesz opakować wywołanie parseInt przy pomocy funkcji try i zwrócić pewną sensowną wartość, jeśli wystąpi wyjątek. Jeśli nie jest to właściwe, możesz zwrócić zero, gdy wystąpi wyjątek, i sprawdzić, czy wynikowa sekwencja zawiera zero, aby określić, czy wystąpił wyjątek, a następnie podjąć odpowiednie działania. – Brian

+0

Druga sugestia (return 'nil') brzmi rozsądnie. Sprawdzę to. – Ralph

Powiązane problemy