为什么在Clojure中从catch部分重现是非法的

Pet*_*ikh 8 clojure

至少已经有一个关于异常复发的问题.我的问题是为什么recurClojure编译器不接受这个

(loop []
  (try
    (catch Exception _ex
      (recur))))
Run Code Online (Sandbox Code Playgroud)

错误"只能从尾部位置重复".

根据控制流程,这recur 在尾部位置,因为代码在recur内部loop形式之后什么都不做.

Ala*_*son 1

如果在询问“为什么会这样?”时,您是在询问历史记录,则将此问题发布到 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)

  • 这个用例当然被考虑过,并且之前已经讨论过。请参阅 https://groups.google.com/forum/#!topic/clojure/0A32oPAyeoY 和 https://dev.clojure.org/jira/browse/CLJ-31?page=com.atlassian.jira.plugin.system例如.issuetabpanels%3Achangehistory-tabpanel#issue-tabs。 (5认同)