以下是我试图描述的retry-n-times函数的变体。同样,这个版本假设您从不关心保留调用(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))))))