以下是我想描述的函数 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))))))