无法在map函数中捕获异常

时间:2016-01-14 09:23:48

标签: function exception clojure exception-handling

我试图捕获传递给地图函数的函数引发的异常,但它没有被捕获。我不明白为什么。

示例:

(defn x [x]
  (throw (Exception. "An exception")))

(try
  (map x '(1 2 3))
  (catch Exception e "caught exception"))

1 个答案:

答案 0 :(得分:4)

你被懒惰所打击。请注意,map会返回一个懒惰的seq,因此只有在尝试访问该x的第一个元素时才会运行seq

如果您通过某些fn,例如doallfirst了解它,您的示例将会有效:

(try
  (doall (map x [1 2 3]))
  (catch Exception e "Caught!"))

那为什么你会收到例外?好吧,因为没有引发异常,try块会返回懒惰的seq,您的REPL会尝试打印出来,为您调用x