问题
Try-catch旨在帮助处理异常。这意味着它将以某种方式帮助我们的系统更加健壮:尝试从意外事件中恢复。
我们怀疑在执行和指令(发送消息)时可能会发生某些事情,因此它会被包含在try中。如果发生几乎意外的事情,我们可以做点什么:我们写下了捕获。我认为我们没有打电话来记录异常。我认为catch块意味着让我们有机会从错误中恢复。
现在,让我们说我们可以从错误中恢复,因为我们可以修复错误。重做是非常好的:
try{ some_instruction(); }
catch (NearlyUnexpectedException e){
fix_the_problem();
retry;
}
这将很快落入永恒循环中,但是假设fix_the_problem返回true,那么我们重试。鉴于Java中没有这样的东西,你将如何解决这个问题?解决这个问题的最佳设计代码是什么?
这就像一个哲学问题,因为我已经知道我所要求的并不是Java直接支持的。
#1 热门回答(220 赞)
你需要像这样附上你的try-catch
里面awhile
环: -
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;
}
}
我已经采取了count
和maxTries
以避免进入无限循环,以防你的try block
中发生异常。
#2 热门回答(39 赞)
强制性的"企业家"解决方案:
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
}
});
#3 热门回答(31 赞)
像往常一样,最好的设计取决于具体情况。通常,我写的东西如下:
for (int retries = 0;; retries++) {
try {
return doSomething();
} catch (SomeException e) {
if (retries < 6) {
continue;
} else {
throw e;
}
}
}