首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何实现re-try-catch?

如何实现re-try-catch?
EN

Stack Overflow用户
提问于 2012-11-06 04:36:55
回答 26查看 241.6K关注 0票数 238

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

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

现在,假设我们从错误中恢复,因为我们可以修复错误。做一次重试是非常好的:

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

这将很快陷入死循环,但假设fix_the_problem返回true,然后重试。既然Java中没有这样的东西,你会如何解决这个问题呢?你最好的设计代码是什么来解决这个问题?

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

EN

回答 26

Stack Overflow用户

回答已采纳

发布于 2012-11-06 04:39:23

您需要将您的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中。

票数 374
EN

Stack Overflow用户

发布于 2012-11-06 05:21:11

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

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
    }
});
票数 66
EN

Stack Overflow用户

发布于 2012-11-06 04:39:57

通常,最好的设计取决于特定的环境。不过,我通常会写下这样的代码:

for (int retries = 0;; retries++) {
    try {
        return doSomething();
    } catch (SomeException e) {
        if (retries < 6) {
            continue;
        } else {
            throw e;
        }
    }
}
票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13239972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档