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变量,那么您可能无法再次获得原始变量environmentenvironment在这种情况下,一个选项是在while循环中使用块范围的副本。

于 2013-07-16T16:00:09.643 回答
1

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

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

可重试组件的一些伪代码。您可以将其抽象为(例如) aRetryingExecutor并提供Callable/Runnable以实际执行您的代码。

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 回答