0

次のような for ループがあります。

for (Environment environment : environmentList) {
//do stuff
}

ループ内で例外をキャッチしましたが、例外を受け取るオブジェクトでコードの実行を再試行したいと考えています。明らかに、カウンターとリスト インデックスを使用して for ループでこれを行うことができますが、これを行う方法があるかどうかに興味がありました。

精緻化、

for (Environment environment : environmentList) {
try{
//do stuff
}catch(exception)
{} //retry code using current environment
}
4

4 に答える 4

1

例外をキャッチしたら、現在の (失敗した) 環境をリストに追加しないでください。これは、多くの失敗があった場合に蓄積されます。その後、失敗したエントリをすべて再試行できますか?

再帰呼び出しを行う場合は、おそらく永遠に終わるので注意が必要です。次に、そのメソッドにいくつかの制約を加えることができます...

ひょっとしたらこんなことも……。

yourMethod(Enviroment[] enviromentList, int attempt)
{
        switch(attempt)
        {

        case FIRST_ATTEMPT:
             for(Enviroment enviroment : enviromentList)
             {
                 try{
                      //YOUR CODE
                      }catch (Exception e){
                      failedList.add(enviroment);
                     }
              }
              yourMethod(failedList, SECOND_ATTEMPT);///RECURSIVE CALL BUT PASS IN CONSTRAINT

        case SECOND_ATTEMPT:
            //YOUR STUFF AGAIN
        }
}
于 2013-07-16T16:10:17.963 に答える
1

for ループで別のループを使用できます。

for (Environment environment : environmentList) {
    while (true) {
        try{

        }catch(exception) {
           continue;  // Exception: continue while
        }
        break;  // No exception: break while.
    }
}

tryただし、実際の動作は、ブロック内で何をしているかによって異なります。同様に、environment変数を変更すると、元の値を取得できなくなる可能性がありますenvironment。その場合、オプションはenvironmentwhileループ内で のブロック スコープのコピーを使用することです。

于 2013-07-16T16:00:09.643 に答える
1

ネイティブではありません。これは自分でコーディングする必要があります。

これには困難が伴うことを覚えておいてください。再試行可能なブロックが常に失敗するとどうなりますか? 繰り返しループしますか? 以前の半分になったらどうなりますか?もう一度やり直しますか?この再試行メカニズムは比較的簡単に実行できますが、考慮すべき多くの結果があります。

再試行可能なコンポーネントの擬似コード。これを (たとえば) a に抽象化し、 /をRetryingExecutor提供して実際にコードを実行することができます。CallableRunnable

while (count < max) {
   try {
     return execution();
   }
   catch (Exception e) {
      count++;
   }

}
throw new Exception("Failed after " + count + " attempts");
于 2013-07-16T16:00:11.270 に答える
0

再試行を自動的に処理したい場合は、Sargeなどのライブラリを使用できます。

Plan plan = Plans.retryOn(TimeoutException.class, 5, Duration.mins(1)).make();

Sarge sarge = new Sarge();
MailService service = sarge.supervise(MailService.class, plan);

service.doSomething(); // Method is retried if TimeoutException is thrown
于 2013-07-24T00:14:01.053 に答える