为什么抛出向上转换检查的异常
Why throws upcasting checked exception
我注意到一些复杂库中的方法,包括标准 JDK,倾向于 throws
向上转换异常。起初我在Apache POI的源代码中发现了这种现象,后来在java.io.FileWriter
中再次看到它是这样的:
public FileWriter(String fileName) throws IOException {
super(new FileOutputStream(fileName));
}
其中 FileOutputStream
的实例化声明了此调用堆栈中唯一的已检查异常 FileNotFoundException
。但是声明了IOException
,是FileNotFoundException
的超class。
那么这是什么原因呢?还是完全取决于程序员的习惯?
避免过于频繁地更改 API 可能是有意义的。
今天,一个方法可以在代码中抛出 IOexception
的子 class,但明天它可能抛出另一个。
虽然在签名中声明的父异常不是太笼统并且不会失去对客户的价值,但似乎可以为异常声明一个基础 class。
例如,一个糟糕的用法是声明 throw Exception
,因为客户端无法理解异常的一般含义并因此处理它。
我注意到一些复杂库中的方法,包括标准 JDK,倾向于 throws
向上转换异常。起初我在Apache POI的源代码中发现了这种现象,后来在java.io.FileWriter
中再次看到它是这样的:
public FileWriter(String fileName) throws IOException {
super(new FileOutputStream(fileName));
}
其中 FileOutputStream
的实例化声明了此调用堆栈中唯一的已检查异常 FileNotFoundException
。但是声明了IOException
,是FileNotFoundException
的超class。
那么这是什么原因呢?还是完全取决于程序员的习惯?
避免过于频繁地更改 API 可能是有意义的。
今天,一个方法可以在代码中抛出 IOexception
的子 class,但明天它可能抛出另一个。
虽然在签名中声明的父异常不是太笼统并且不会失去对客户的价值,但似乎可以为异常声明一个基础 class。
例如,一个糟糕的用法是声明 throw Exception
,因为客户端无法理解异常的一般含义并因此处理它。