为什么从Clojure的catch部分重复出现是非法的
至少已经有关于在异常情况下重复出现的问题。我的问题是为什么Clojure编译器不接受这个为什么从Clojure的catch部分重复出现是非法的,clojure,Clojure,至少已经有关于在异常情况下重复出现的问题。我的问题是为什么Clojure编译器不接受这个recur (loop [] (try (catch Exception _ex (recur)))) 错误为“只能从尾部位置重复” 根据控制流,此重复处于尾部位置,因为在重复内部循环表单中,代码不做任何操作。如果在询问“为什么会这样?”时,您询问的是历史记录,您可以在处将此问题发布到Clojure邮件列表中,获得更好的答案clojure@googlegroups.com。我怀疑原因
recur
(loop []
(try
(catch Exception _ex
(recur))))
错误为“只能从尾部位置重复”
根据控制流,此重复
处于尾部位置,因为在重复
内部循环
表单中,代码不做任何操作。如果在询问“为什么会这样?”时,您询问的是历史记录,您可以在处将此问题发布到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)))))
结果:
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
显然,
rescur
在finally
子句中也是不允许的<代码>(循环[](try(catch Exception uu)(finally(recur)))会导致相同的编译错误。这个用例当然已经考虑过了,并且之前已经讨论过。参见和,例如。