以下是我想描述的函数retry-n-times的变种。再次强调,这个版本假设你从未想过保留调用抛出的异常。
(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))))))