2016-11-25 2 views
0

使用しようとしていますhttps://github.com/grammarly/perseverance,なぜ次は失敗しますか?つまり最後の呼び出しは、まだ例外を生成しclojure retry library perseverance usage

(defn fail-n 
    "returns a function that will fail to process for the first n times is is called" 
    [n] 
    (let [cnt (atom 0)] 
    (fn [] 
     (if (< @cnt n) 
     (do (swap! cnt inc) 
      (throw (RuntimeException. "Failed"))) 
     :success)))) 

(defn safe-fail-n [n] 
    (p/retriable { 
       ;;:catch [RuntimeException] 
       } (fail-n n))) 

;;(def f (fail-n 1)) 
(def f (safe-fail-n 2)) 

(p/retry {;;:strategy (p/constant-retry-strategy 0) 
      ;;:catch [Exception] 
      ;;:log-fn (fn [& a] (println "Retrying "a)) 
      } 
      (f)) 

答えて

1

チェックアウトgithub README、あなたはそれ以外何もcatchedされていない

p/retriable形でREをキャッチする必要があります - または再試行

user=> (let [x (fail-n 5)] 
     (p/retry {} 
      (p/retriable {:catch [RuntimeException]} (x)))) 

java.lang.RuntimeException: Failed, retrying in 0,5 seconds... 
java.lang.RuntimeException: Failed, retrying in 0,5 seconds... 
java.lang.RuntimeException: Failed, retrying in 0,5 seconds... 
java.lang.RuntimeException: Failed, retrying in 1,0 seconds... 
java.lang.RuntimeException: Failed, retrying in 2,0 seconds... 
:success 

関連する文書:

:catch - retriableによって捕捉されるExceptionクラスのリストである必要があります。 デフォルトのの値は[java.io.IOException]です。忍耐は意図的にすべての例外をキャッチしません IO関連ではないエラーの再試行を避けるために、プログラムでの適切なエラー処理を回避します。 しかし、あなたは常に提供することができます:キャッチ[例外]を使用すると、内部の任意の潜在的な例外は私が失敗した理由を私は本当にない理由をあなたの例の仕事を理解し、しかし

+0

再試行可能であることを確信している場合。私は 'RuntimeException'と' Exception'をキャッチしてコメントしました。 – nha

+0

それはそれを捕まえていません、正確には*それはコメントアウトされています – birdspider

+0

右 - 私はいくつかの古いREPL状態をぶら下げていたに違いない – nha