Clojure未捕获NumberFormatException
在以下代码中,Clojure(1.2)打印了错误的消息:Clojure未捕获NumberFormatException,clojure,numberformatexception,Clojure,Numberformatexception,在以下代码中,Clojure(1.2)打印了错误的消息: (try (let [value "1,a"] (map #(Integer/parseInt %) (.split value ","))) (catch NumberFormatException _ (println "illegal argument"))) 这应该打印“非法参数”,但它会打印一个(1) 我做错了什么 这是因为map返回的惰性序列吗?它应该如何编写?try特殊表单只捕获在主体代码的动态扩展期间引发
(try
(let [value "1,a"]
(map #(Integer/parseInt %) (.split value ",")))
(catch NumberFormatException _ (println "illegal argument")))
这应该打印“非法参数”,但它会打印一个(1
)
我做错了什么
这是因为
map
返回的惰性序列吗?它应该如何编写?try特殊表单只捕获在主体代码的动态扩展期间引发的异常。这里map
返回一个惰性序列,然后从try
特殊表单和retu中传递出去然后打印机评估序列,并在该点抛出异常
在
doall
中包装map
应该可以解决您的问题。您应该会发现这很有帮助:我确实试过了。它似乎仍然返回一个封装在RuntimeException中的NFE。@拉尔夫:在1.3下它可以工作。您可以使用try包装parseInt调用,并在异常发生时返回一些合理的值。如果这不合适,当异常发生时,您可以返回nil,并检查结果序列是否包含nil,以确定是否发生异常,然后采取适当的措施。第二个建议(returnnil
)听起来很合理。我会检查一下。我尝试了nil
替换解决方案,效果很好。谢谢!这个示例使用上述nil
替换方法跳过无效的解决方案:(让[value“1,a”](删除nil?(map#(try(Integer/parseInt%)(catch Exception_unil))(.split value“,”)