我试图捕获传递给地图函数的函数引发的异常,但它没有被捕获。我不明白为什么。
示例:
(defn x [x]
(throw (Exception. "An exception")))
(try
(map x '(1 2 3))
(catch Exception e "caught exception"))
答案 0 :(得分:4)
你被懒惰所打击。请注意,map
会返回一个懒惰的seq
,因此只有在尝试访问该x
的第一个元素时才会运行seq
。
如果您通过某些fn
,例如doall
或first
了解它,您的示例将会有效:
(try
(doall (map x [1 2 3]))
(catch Exception e "Caught!"))
那为什么你会收到例外?好吧,因为没有引发异常,try
块会返回懒惰的seq
,您的REPL会尝试打印出来,为您调用x
。