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