如果方法使用抛出异常的方法,如何正确捕获异常

时间:2019-10-01 17:20:06

标签: java

我有一个问题,关于在使用另一个可能引发异常的方法的方法中捕获异常。

public void methodA(File file) {
  try {
  }
  catch (IOException ex) {
  }
}

public void methodB() {
 // do something with the file
 File file = new File("/example.txt");
 methodA(file);
}

我需要在methodB内创建一个try and catch块吗?还是足以在方法A中捕获IOException的异常?

3 个答案:

答案 0 :(得分:2)

这取决于您想要实现的目标。

在您的代码示例中,methodA将处理异常并继续执行methodB而不会中断。这可能不是您想要的,因为读取文件时出错,应该妥善处理。

您最有可能希望将异常冒泡到执行链上并在相关对象中进行处理(例如,某些错误处理程序可以将错误消息输出给用户)。

像这样冒充您的异常:

public void methodA(File file) throws CustomUserInputException {
  try {
  }
  catch (IOException ex) {
    throw new CustomUserInputException(ex, "Error opening file" + file.getPath());
  }
}

然后在这样的适当对象中处理它:

public void methodB() {
 // do something with the file
 File file = new File("/example.txt");
 try {
   methodA(file);
  }
  catch (CustomUserInputException ex) {
    showErrorToAnUser();
    stopStandardProgramExecution();
  }
}

答案 1 :(得分:1)

否,在这种情况下,您不需要在methodB中-但您可能想要这样做,因为methodA可能会在IOException旁边引发其他错误。

这取决于您的意图和异常的类型-如果您的methodA抛出了一个已检查的异常,methodB必须捕获它或声明它抛出了该异常。如果它是RuntimeException,则methodB可能会捕获它或将其忽略。 在大多数技术堆栈中,检查异常很少见,大多数人认为这是一次失败的实验。

最后,一个方法是否需要捕获异常取决于-methodB可以想像地处理错误吗?如果是这样,抓住它-如果不是,让它冒泡,例如到一般的错误处理程序,甚至使程序崩溃。没有什么比捕获每个错误并做错事的程序更令人讨厌了。

答案 2 :(得分:-1)

您不能这样做,因为异常只能在调用堆栈上移动。如果程序还在异常之后运行方法,那么即使首先创建异常又有什么意义呢?

尝试处理发生异常的地方。如果在创建File时可能出现异常,则应在创建文件的地方对其进行处理。否则,确保传入值不是异常的开销将太高。

我建议要么将其捕获在methodB中,要么将文件名传递到methodA中,然后让它创建File并捕获所有异常。