在try / catch块捕获异常之后,如何继续执行代码?

时间:2019-10-02 17:38:10

标签: java

try
{
someTask();
someTask2();
someTask3();
someTask4();
someTask5();
}
catch (Exception e)
{
// log the error
}

如果我的任务之一失败,我想要记录发生的事情,但是我想继续运行其余的任务。我知道我可以用自己的try / catch包围每个任务方法,但是有没有一种更简洁的方法,所以我没有那么多try / catch块?

4 个答案:

答案 0 :(得分:2)

最好的方法是让每个方法的内部都带有try / catch

void someMethod(){
 try{
//code of method 1
 }catch(Exception e){
  e.printstackTrace()
 }
}

,然后在没有try / catch的情况下将其全部调用。

someTask();
someTask2();
someTask3();
someTask4();
someTask5();

现在,如果一个失败,另一个将继续。

答案 1 :(得分:2)

假设您的任务返回void并且不带任何参数,则可以创建一个功能接口:

@FunctionalInterface
interface Task {
    void perform() throws Exception;
}

然后创建一个帮助程序方法,该方法将处理日志记录并将Task作为参数:

private static void invoke(Task task) {
    try {
        task.perform();
    } catch (Exception e) {
        // log here    
    }
}

然后使用它:

class MyClass {
    public static void main(String[] args) {
        invoke(MyClass::someTask);
        invoke(MyClass::someTask1);
    }

    private static void someTask() throws Exception {
        System.out.println("Task 1");
    }

    private static void someTask1() throws Exception {
        throw new Exception("Exception");
    }
}

答案 2 :(得分:0)

要运行其余任务,必须将每个任务放在单独的“ try”块中。这是一种干净的方法。否则,您将如何知道哪个任务失败以及如何调试它?

此外,将每个预期的错误从更具体的内容开始并以更一般的内容进行处理,将每个预期的错误分别放入catch块也被视为一种好习惯。这样您可以立即了解发生了什么问题并节省调试时间

try {
    someTask1;
}catch (ClassNotFoundException e) {
// log the error
}catch (Exception e) {
// log the error
}

try {
    someTask2;
}catch (ArithmeticException e) {
// log the error
}catch (ArrayIndexOutOfBoundsException e) {
// log the error
}catch (Exception e) {
// log the error
}

答案 3 :(得分:-2)

也许使用递归方法:

public void myMethod (int state){

 try
 {

  switch(state) {
    case 1:
      state+=1;
      someTask();
      myMethod(state);
      break;
    case 2:
      state+=1;
      someTask2();
      myMethod(state);
      break;
    case 3:
      state+=1;
      someTask3();
      myMethod(state);
      break;
    default:
      state=-1;
}

 }
  catch (Exception e)
 {
 // If some task had an exception, this catch call the next task, because the state variable incremented.
  myMethod(state);
 }

public static void main (String[] Args){

myMethod(1);

}

}