在Java中再次运行一段代码

时间:2015-09-03 15:04:10

标签: java

我是一名Java初学者,遇到了一些麻烦。我有一个try-catch块,其中try部分尝试运行一段代码,如果catch代码抛出任何类型的错误,try部分会运行不同的代码。它看起来像:

try {
    <code to try>
} catch(Exception e) {
    <various variable reassignments>
    <run "try" code again>  (what I don't know how to do)
}

我认为这涉及某种循环,我对其使用相当熟悉,但我不知道如何将其格式化以适应这种情况。

8 个答案:

答案 0 :(得分:4)

如果成功,您可以打破循环,并在出现异常时保持循环:

while (true) {
    try {
         <code to try>
         break; // operations were successful, so leave the loop!
    } catch(Exception e) {
         <various variable reassignments>
         // do not break, i.e. run "try" code again
    }
}

答案 1 :(得分:2)

您可以将整个try/catch块放入循环中,也可以通过trycatch进行方法调用。请注意,如果使用循环,则需要一些逻辑来防止无限循环,如果每次抛出Exception,即使在更新变量值之后也是如此。

进行方法调用

String arg = "foo";
try {
   Object.method(arg); // your code, taking your variable as an argument
} catch (Exception e){
   arg = "bar";        // update variable value
   Object.method(arg); // call your code again
}

使用循环

while (true){
    try {
        // ... your code, which might throw an Exception
        break;  // break if there are no exceptions
    } catch (Exception e){
        // assign vars
    }
}

答案 2 :(得分:1)

这突出了一个小的架构问题。

try / catch块中没有隐式循环:如果抛出Exception,您会尝试恢复。

你可以做的是,从最好到最差:

  1. try代码放在方法中,根据需要进行参数化,以便在再次调用时其行为可以更改。然后在trycatch块中使用不同的参数调用该方法。

    请注意,在这种情况下,catch块中的调用可能会再次抛出相同的Exception,您可能认为此时无法恢复。

  2. 使用嵌套的try / catch块,您可以在嵌套在try的{​​{1}}块中的try块中改变程序块。

    这没关系,但不太可读。

    多个嵌套catch / try块会严重降低您的可读性。

  3. 将整个catch / try置于一个循环中,其中断条件在所有终止中定义(否则您可能会永远循环并记录大量堆栈迹线)

    这在理论上是可以接受的,但通常会随着时间的推移而受到灾难的影响。

答案 3 :(得分:1)

<code to try>重构为一个单独的方法。在trycatch内调用它。通过这种方式,您将实现类似单次重试的功能。另一个选择是将整个try catch置于while循环中,并使用变量控制所需的重试次数,并根据结果初始化不同的变量。

答案 4 :(得分:0)

我想你想要这样的东西:

boolean run = true;
while(run)
{
    try
    {
        // do action
        run = false;
    }
    catch(Exception e)
    {
        // do whatever actions
        // when you want to break, set run = false
    }
}

答案 5 :(得分:0)

您可以将整个try / catch包含到for / while循环中,该循环将在try成功运行时退出。

while (true) {
    try {
         <code to try>
         //exit on success
           } catch(Exception e) {
                 <various variable reassignments>                 
                   }
 }

答案 6 :(得分:0)

您可以使用InboxArray循环进行换行,然后如果您没有进入z,x,y,a,b,c 作业并进入while部分,请执行编码和{ {1}}循环将再次运行try-catch部分。

例如:

success = true

答案 7 :(得分:0)

使用Failsafe

RetryPolicy retryPolicy = new RetryPolicy()
  .retryOn(SomeException.class);
  .withBackoff(1, 30, TimeUnit.SECONDS);

Failsafe.with(retryPolicy)
  .with(new Listeners().onRetry((r, f) -> reAssignVariables())
  .run(() -> codeToTry());

使用这种方法,Failsafe会为您重试,Failsafe可以灵活地指定何时应该执行重试以及是否在重试之间延迟。