如果方法使用引发异常的方法,如何正确捕获异常



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

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);
}

我是否需要在方法 B 内创建一个 try 和 catch 块?或者在这种情况下,在方法 A 中捕获异常就足够了?

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

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

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

像这样冒出你的异常:

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();
}
}

不,在这种情况下,您不需要在方法B中这样做 - 但您可能希望这样做,因为方法A可能会在IOException旁边抛出其他错误。

这取决于您的意图和异常类型 - 如果您的方法 A 抛出已检查的异常,方法 B 必须捕获它或声明它抛出该异常。如果是运行时异常,方法 B 可能会捕获或忽略它。 在大多数技术堆栈中,检查异常很少见,大多数人认为这是一个失败的实验。

最后,方法是否需要捕获异常取决于 - 方法B可以处理错误吗?如果是这样,请在那里捕获它 - 如果没有,让它冒泡,例如一般的错误处理程序,甚至使程序崩溃。没有什么比捕获每个错误并做错误事情的程序更烦人的了。

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

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

我建议要么在methodB中捕获它,要么将文件名传递到methodA中,让它创建File并捕获任何异常。

最新更新