你如何实现重试捕获?

新手上路,请多包涵

Try-catch 旨在帮助处理异常。这意味着它会以某种方式帮助我们的系统变得更加健壮:尝试从意外事件中恢复。

我们怀疑在执行和指令(发送消息)时可能会发生一些事情,所以它被包含在 try 中。如果发生了几乎出乎意料的事情,我们可以做一些事情:我们编写 catch。我不认为我们打电话只是为了记录异常。我认为 catch 块是为了给我们从错误中恢复的机会。

现在,假设我们从错误中恢复,因为我们可以修复错误。重试可能会非常好:

 try{ some_instruction(); }
catch (NearlyUnexpectedException e){
   fix_the_problem();
   retry;
}

这将很快陷入永恒循环,但假设 fix_the_problem 返回 true,然后我们重试。鉴于Java中没有这样的东西,你将如何解决这个问题?解决这个问题的最佳设计代码是什么?

这就像一个哲学问题,因为我已经知道我所要求的不是 Java 直接支持的。

原文由 Andres Farias 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 491
2 个回答

您需要将 try-catch 包含在 while 循环中,如下所示: -

 int count = 0;
int maxTries = 3;
while(true) {
    try {
        // Some Code
        // break out of loop, or return, on success
    } catch (SomeException e) {
        // handle exception
        if (++count == maxTries) throw e;
    }
}

我已采取 countmaxTries 以避免陷入无限循环,以防异常继续发生在您的 try block 中。

原文由 Rohit Jain 发布,翻译遵循 CC BY-SA 3.0 许可协议

强制性“企业”解决方案:

 public abstract class Operation {
    abstract public void doIt();
    public void handleException(Exception cause) {
        //default impl: do nothing, log the exception, etc.
    }
}

public class OperationHelper {
    public static void doWithRetry(int maxAttempts, Operation operation) {
        for (int count = 0; count < maxAttempts; count++) {
            try {
                operation.doIt();
                count = maxAttempts; //don't retry
            } catch (Exception e) {
                operation.handleException(e);
            }
        }
    }
}

并致电:

 OperationHelper.doWithRetry(5, new Operation() {
    @Override public void doIt() {
        //do some stuff
    }
    @Override public void handleException(Exception cause) {
        //recover from the Exception
    }
});

原文由 ach 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题