2011-02-05 26 views
5

Trong đoạn mã sau, Clojure (1.2) được in thông điệp sai lầm:Clojure không bắt NumberFormatException

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

này nên in "lập luận bất hợp pháp", nhưng thay vào đó nó in một (1#<NumberFormatException java.lang.NumberFormatException: For input string: "a">.

Tôi đang làm gì sai?

Đây có phải là do chuỗi lười được trả về bởi map không? Làm thế nào nó nên được viết?

+2

Bạn sẽ thấy điều này hữu ích: http://groups.google.com/group/clojure/msg/f4ea5a9c38f4d991 – MayDaniel

Trả lời

10

Biểu mẫu đặc biệt try chỉ bắt ngoại lệ được nêu trong suốt quá trình động của mã nội dung. Ở đây map đang trả về một chuỗi lười biếng, sau đó được chuyển ra khỏi biểu mẫu đặc biệt try và trả lại. Máy in sau đó đánh giá trình tự, và tại thời điểm đó, ngoại lệ được ném.

Gói map trong doall sẽ khắc phục sự cố của bạn.

+1

Tôi thực sự đã thử điều đó. Nó dường như vẫn trả về một NFE được bao bọc trong một RuntimeException. – Ralph

+1

@Ralph: Dưới 1.3 nó hoạt động. Bạn có thể bọc cuộc gọi parseInt với thử và trả về một số giá trị hợp lý nếu một ngoại lệ xảy ra. Nếu điều đó không thích hợp, bạn có thể trả về nil khi một ngoại lệ xảy ra và kiểm tra xem chuỗi kết quả có chứa nil để xác định xem một ngoại lệ có xảy ra không và sau đó hành động phù hợp. – Brian

+0

Đề xuất thứ hai (trả về 'nil') có vẻ hợp lý. Tôi sẽ kiểm tra điều đó. – Ralph

Các vấn đề liên quan