Clojure没有捕获NumberFormatException异常

5
在以下代码中,Clojure(1.2)打印了错误的消息:
(try
  (let [value "1,a"]
    (map #(Integer/parseInt %) (.split value ",")))
  (catch NumberFormatException _ (println "illegal argument")))

这应该打印出“非法参数”,但实际上它打印了一个(1#<NumberFormatException java.lang.NumberFormatException: For input string: "a">
我做错了什么?
这是因为map返回的惰性序列吗?应该如何编写呢?

2
你应该会发现这个链接很有帮助:http://groups.google.com/group/clojure/msg/f4ea5a9c38f4d991 - MayDaniel
1个回答

10
try特殊形式只能捕获在其体代码的动态范围内引发的异常。这里map返回一个惰性序列,然后传递出try特殊形式并返回。打印机随后对序列进行求值,在此时抛出异常。
doall包装map应该可以解决您的问题。

1
我实际上尝试过了。它似乎仍然返回一个包装在RuntimeException中的NFE。 - Ralph
1
@Ralph:在1.3版本下它可以工作。你可以用try包装parseInt调用,并在发生异常时返回一些合理的值。如果这不合适,你可以在发生异常时返回nil,并检查生成的序列是否包含nil来确定是否发生了异常,然后采取相应的措施。 - Brian
第二个建议(返回“nil”)听起来合理。我会检查一下。 - Ralph
我尝试了使用nil替换的解决方案,它非常有效。谢谢! - Ralph
这个例子使用上述nil替换方法跳过无效的解决方案:(let [value“1,a”](remove nil?(map#(尝试(Integer / parseInt%)(catch Exception _ nil))(.split value“,”)))) - funkotron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接