我有一个像这样的for循环:
for (Environment environment : environmentList) {
//do stuff
}
我在循环中捕获异常,但是想要使用接收异常的对象重试代码。显然我可以使用计数器和列表索引使用for循环执行此操作,但我很好奇是否有任何方法可以执行此操作。
精,
for (Environment environment : environmentList) {
try{
//do stuff
}catch(exception)
{} //retry code using current environment
}
答案 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