你如何实施重新尝试抓住?

try-catch意在帮助处理exception。 这意味着它会帮助我们的系统更健壮:尝试从意外事件中恢复过来。

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

现在,让我们说,我们从错误中恢复,因为我们可以解决什么是错的。 做一个重试可能是非常好的:

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

这会很快落在永恒的循环中,但是让我们说fix_the_problem返回true,然后我们重试。 鉴于Java中没有这样的事情,你将如何解决这个问题? 什么是你最好的devise代码来解决这个问题?

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

你需要把你的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以避免遇到无限循环,以防止exception继续发生在您的try block

强制性“企业”解决scheme:

 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 } }); 

像往常一样,最好的devise取决于具体情况。 通常情况下,我写的东西是这样的:

 for (int retries = 0;; retries++) { try { return doSomething(); catch (SomeException e) { if (retries < 6) { continue; } else { throw e; } } } 

虽然try/catch到一个众所周知的好策略,我想build议你recursion调用:

 void retry(int i, int limit) { try { } catch (SomeException e) { // handle exception if (i >= limit) { throw e; // variant: wrap the exception, eg throw new RuntimeException(e); } retry(i++, limit); } } 

您可以使用jcabi-aspects (我是开发人员)的AOP和Java注释:

 @RetryOnFailure(attempts = 3, delay = 5) public String load(URL url) { return url.openConnection().getContent(); } 

您也可以使用@Loggable@LogException注释。

您确切的scheme通过Failsafe处理:

 RetryPolicy retryPolicy = new RetryPolicy() .retryOn(NearlyUnexpectedException.class); Failsafe.with(retryPolicy) .onRetry((r, f) -> fix_the_problem()) .run(() -> some_instruction()); 

很简单。

使用带有本地status标志的while循环。 将标志初始化为false并在操作成功时将其设置为true ,例如:

  boolean success = false; while(!success){ try{ some_instruction(); success = true; } catch (NearlyUnexpectedException e){ fix_the_problem(); } } 

这将继续重试,直到成功。

如果您只想重试一定次数,那么还要使用一个计数器:

  boolean success = false; int count = 0, MAX_TRIES = 10; while(!success && count++ < MAX_TRIES){ try{ some_instruction(); success = true; } catch (NearlyUnexpectedException e){ fix_the_problem(); } } if(!success){ //It wasn't successful after 10 retries } 

如果不成功的话,这将尝试最多10次,直到如果之前成功的话它将退出。

这些答案大部分基本上是一样的。 我的也是,但这是我喜欢的forms

 boolean completed = false; Throwable lastException = null; for (int tryCount=0; tryCount < config.MAX_SOME_OPERATION_RETRIES; tryCount++) { try { completed = some_operation(); break; } catch (UnlikelyException e) { lastException = e; fix_the_problem(); } } if (!completed) { reportError(lastException); } 

解决这个问题的一个简单的方法是将try / catch包装在一个while循环中,并保持一个计数。 通过这种方法,您可以通过在维护日志logging的同时检查其他variables的计数来防止无限循环。 这不是最精妙的解决scheme,但它会起作用。

Try-Catch所做的一切就是让你的程序优雅地失败。 在catch语句中,您通常会尝试logging错误,并在需要时回滚更改。

 bool finished = false; while(finished == false) { try { //your code here finished = true } catch(exception ex) { log.error("there was an error, ex"); } } 

使用do-while来devise重试块。

 boolean successful = false; int maxTries = 3; do{ try { something(); success = true; } catch(Me ifUCan) { maxTries--; } } while (!successful || maxTries > 0) 

我知道这里已经有很多类似的答案了,我的情况并没有太大的不同,但是我会发布它,因为它涉及到一个特定的案例/问题。

PHP处理facebook Graph API ,你有时会得到一个错误,但是立即重新尝试同样的事情会给出一个积极的结果(对于超出这个问题范围的各种神奇的互联网原因)。 在这种情况下,没有必要修复任何错误,但只是再试一次,因为有某种“Facebook错误”。

这段代码在创buildfacebook会话后立即使用:

 //try more than once because sometimes "facebook error" $attempt = 3; while($attempt-- > 0) { // To validate the session: try { $facebook_session->validate(); $attempt = 0; } catch (Facebook\FacebookRequestException $ex) { // Session not valid, Graph API returned an exception with the reason. if($attempt <= 0){ echo $ex->getMessage(); } } catch (\Exception $ex) { // Graph API returned info, but it may mismatch the current app or have expired. if($attempt <= 0){ echo $ex->getMessage(); } } } 

另外,通过让for循环倒数到零( $attempt-- ),它可以很容易地改变将来的尝试次数。

以下是我用非常简单的方法解决的!

  while (true) { try { /// Statement what may cause an error; break; } catch (Exception e) { } } 

我不知道这是否是“专业”的方式来做到这一点,我不完全确定它是否适用于一切。

 boolean gotError = false; do { try { // Code You're Trying } catch ( FileNotFoundException ex ) { // Exception gotError = true; } } while ( gotError = true ); 

https://github.com/tusharmndr/retry-function-wrapper/tree/master/src/main/java/io

 int MAX_RETRY = 3; RetryUtil.<Boolean>retry(MAX_RETRY,() -> { //Function to retry return true; }); 

万一它是有用的,更多的select来考虑,所有扔在一起(停止文件,而不是重试,睡觉,继续更大的循环)都可能有帮助。

  bigLoop: while(!stopFileExists()) { try { // do work break; } catch (ExpectedExceptionType e) { // could sleep in here, too. // another option would be to "restart" some bigger loop, like continue bigLoop; } // ... more work }