以下是我想描述的函数重试-n-次的变化形式。同样,这个版本假定你不关心保留调用的异常(f)。
(defn retry-n-times [f n]
(let [sentinel (Object.)]
(loop [i 0]
(if (= i n)
;; 在这里,你可以抛出你想要的异常。
;; 在此示例中,我只是返回一个映射。
{:call-count i, :failed-every-time true}
;; 无需 println - 但在测试新函数时看到正在发生的事情是很好的
;; 状态。
(let [_ (println "调用 (f) 尝试" (inc i) "...")
ret (try
(f)
(catch java.lang.AssertionError e
sentinel))]
(if (identical? ret sentinel)
(recur (inc i))
ret))))))