至少已经有一个关于异常复发的问题.我的问题是为什么recurClojure编译器不接受这个
(loop []
(try
(catch Exception _ex
(recur))))
Run Code Online (Sandbox Code Playgroud)
错误"只能从尾部位置重复".
根据控制流程,这recur 是在尾部位置,因为代码在recur内部loop形式之后什么都不做.
如果在询问“为什么会这样?”时,您是在询问历史记录,则将此问题发布到 Clojure 邮件列表 (网址为 ) 可能会得到更好的答案clojure@googlegroups.com。我怀疑原因是编译器作者从未考虑过这个用例。
您可以很容易地模拟您想要的行为,如本示例所示。它不像上一个问题的大多数答案那样使用宏:
(loop [count 5]
(newline)
(println "top of loop; count=" count)
(let [caught-ex (try
(println "in try")
(/ 1 0)
false
(catch Exception ex
(println " in catch; count=" count " cause: " (.getMessage ex))
true))]
(when (and caught-ex
(pos? count))
(recur (dec count)))))
Run Code Online (Sandbox Code Playgroud)
结果:
top of loop; count= 5
in try
in catch; count= 5 cause: Divide by zero
top of loop; count= 4
in try
in catch; count= 4 cause: Divide by zero
top of loop; count= 3
in try
in catch; count= 3 cause: Divide by zero
top of loop; count= 2
in try
in catch; count= 2 cause: Divide by zero
top of loop; count= 1
in try
in catch; count= 1 cause: Divide by zero
top of loop; count= 0
in try
in catch; count= 0 cause: Divide by zero
Run Code Online (Sandbox Code Playgroud)