我想在放弃异常之前执行一次func几次。 但是它在Clojure中无法从catch block重现。 这是如何实现的?Clojure:如何在异常时重现?
(loop [tries 10]
(try
(might-throw-exception)
(catch Exception e
(when (pos? tries) (recur (dec tries))))))
java.lang.UnsupportedOperationException: Cannot recur from catch/finally
我能找到的最好的是以下笨拙的解决方案(包装在FUNC和调用它)
(defn do-it []
(try
(might-throw-exception)
(catch Exception e nil)))
(loop [times 10]
(when (and (nil? (do-it)) (pos? times))
(recur (dec times))))
这是一个好方法。我会将它添加到clojure.contrib或其他东西。 – GabiMe 2009-12-10 10:26:20
它实际上和海报建议的解决方案一样。但宏在一般情况下更容易实现。宏是任何lisp变体的杀手锏。 – 2009-12-10 18:17:26
这不完全相同的解决方案。海报的建议不会捕获块的返回值,并且如果它发生该块将无法返回nil。吞下例外。但你是对的:它基本上是一样的想法。宏只是隐藏样板。 – kotarak 2009-12-10 21:48:26