我对使用try / catch块相当新,所以我不知道如何执行此命令。
如果我发现错误,我想等一段时间(10秒左右)然后尝试运行相同的代码行以尝试继续我的try块。我的程序是用Java编写的。我查看了这两个页面:Page1,Page2,但它们都不是Java。我也查看了this,但他们没有在使用catch块时解决。这可能吗,我将如何在我的catch块中实现它而不是仅仅打印错误?
答案 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重试该部分。我从未尝试过,但可以在break
和catch
中的标签中移动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;
}