捕获异常后,在try块中恢复代码

时间:2014-04-16 18:40:36

标签: java exception-handling try-catch

我对使用try / catch块相当新,所以我不知道如何执行此命令。

如果我发现错误,我想等一段时间(10秒左右)然后尝试运行相同的代码行以尝试继续我的try块。我的程序是用Java编写的。我查看了这两个页面:Page1Page2,但它们都不是Java。我也查看了this,但他们没有在使用catch块时解决。这可能吗,我将如何在我的catch块中实现它而不是仅仅打印错误?

5 个答案:

答案 0 :(得分:1)

99%的时间,您希望在try-catch之后重新运行代码块而不是异常行。

如果你需要从那一行开始运行,那么你就可以在另一个仅封装代码的方法中使用你的代码(也可以在那里移动try-catch)。

我的建议是这样的:

void method(){
    try{
       codeline1;
       codeline2;
       codeline3;
       codeline4;
    }
    catch(Exception ex)
    {
        restorClassStateBeforeCodeLine1();
        method();
    }
}

通过那个剪断我建议让你的整个try-catch用一个单独的方法。

等待随机间隔也是不好的做法。你永远都不知道每次10秒是否合适。

我建议的另一种方式是:

label: {
    try {
        ...
        if (condition)
            break label;
        ...
    } catch (Exception e) {
        ...
    }
}

它使用java labels重试该部分。我从未尝试过,但可以在breakcatch中的标签中移动try

答案 1 :(得分:0)

我认为不可能从catch块中返回try块中的某一行。因为当throw被执行时,运行时系统将从调用堆栈弹出帧,寻找异常处理程序来匹配抛出的异常,一旦从堆栈中弹出帧,它就消失了。有关这方面的更多信息,请访问here

您可以做的是从catch块中调用导致throw的方法。但这意味着它将从头开始执行您的方法,因此您可能希望尝试重新排列代码,以便这不会导致任何其他问题。编辑:另一个答案完全证明了我的意思。

答案 2 :(得分:0)

这个简单的程序遍历数组值,对每个值进行测试,直到找到一个不会产生异常的值

public static void main(String[] args) {
    int[] array=new int[]{0,0,0,0,5};
    for(int i=0; i<array.length;i++)  {
        try {
            System.out.println(10/array[i]);
            break;
        } catch(Exception e) {
            try { Thread.sleep(1000); } catch(Exception ignore){}
        }
    }
}

答案 3 :(得分:0)

while(true){
   try{
      //actions where some exception can be thrown
      break;//executed when no exceptions appeared only
   }
   catch(YourException e){
      Thread.sleep(10_000);
   }
}

当您的指令未执行时,将重复此循环。当try-block中的代码成功执行中断时,可以帮助您完成此循环

答案 4 :(得分:0)

由于您说只有2行代码遇到间歇性错误,请尝试与此类似的内容。

    public static void main(String... args)
    {
        try
        {
            //Some Logic

            //Error throwing logic in method
            while(!doLogic())
            {
                Thread.sleep(1000);//Sleep here or in doLogic catch
            }

        //Continuing other logic!
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    static Integer i = null;
    public static boolean doLogic()
    {
        try
        {
            //Lines that throw error
            System.out.println(i.toString());//NPE First run
        }
        catch (Exception e)
        {
            i = 1;
            return false;
        }
        return true;
    }