...但我并没有真正理解使用这些功能,而不仅仅是在每个函数中都有捕获。
关键是调用堆栈上的下一个函数可能不知道如何处理异常。例子:
public class Test {
public Object doSomething(String source) throws IOException {
try (InputStream is = openAsStream(source)) {
// ... read and process stuff
return ...
}
}
public InputStream openAsStream(String name) throws IOException {
String fileName = // ... do something with 'name'
return new FileInputStream(name);
}
public static void main(String[] args) {
// ...
Test t = new Test();
try {
t.doSomething(args[0]);
} catch (IOException ex) {
System.err.println("Cannot handle '" + args[0] + "'");
}
}
}
openAsStream
调用FileInputStream
可能IOException
抛出. 该openAsStream
方法无法从中恢复,因此它让它传播。该doSomething
方法也不知道如何处理它,因此它允许它传播。最后,异常到达main
... 它知道如何向用户解释问题。
现在您可以编写openAsStream
来捕获IOException
,打印错误消息并返回null
. 但这将是一个很大的错误:
关键是方法应该只处理可以在该级别充分处理的异常。应该允许其他人传播。(或者可能包含在另一个异常中......如果这是 API 设计所要求的。)