用迭代for循环重新执行一个对象

时间:2013-07-16 15:56:27

标签: java loops for-loop error-handling iteration

我有一个像这样的for循环:

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

我在循环中捕获异常,但是想要使用接收异常的对象重试代码。显然我可以使用计数器和列表索引使用for循环执行此操作,但我很好奇是否有任何方法可以执行此操作。

精,

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

4 个答案:

答案 0 :(得分:1)

您可以在for循环中使用另一个循环:

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

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

但实际行为将取决于您在try区块内所做的事情。比如,如果您更改了environment变量,那么您可能无法再次获得原始environment。在这种情况下,一个选项是在environment循环中使用while的块作用域副本。

答案 1 :(得分:1)

不是原生的。你必须自己编写代码。

请记住,这充满了困难。如果您的可重试块总是失败会发生什么?你想反复循环吗?如果它完成了之前完成的一半会发生什么?你想让它再次重做吗?这种重试机制相对容易执行,但要考虑很多后果。

可重试组件的一些伪代码。您可以将其抽象为(比方说)RetryingExecutor并提供Callable / Runnable来实际执行您的代码。

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

}
throw new Exception("Failed after " + count + " attempts");

答案 2 :(得分: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
        }
}

答案 3 :(得分: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