以下是我试图描述的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))))))