我正在编写API
void doSomething(args) throws Exception1, Exception2;
Exception1是Exception2的子类型。
Intellij的想法是说“已经在投掷列表中有一个更普遍的例外。”我知道java只要求我在throws子句中使用Exception2但是我认为我应该在throws子句中同时用于文档目的,并向调用者指出他们可以分别捕获每个并为每个执行不同的操作。在我的API实现中,我抛出Exception1并调用一个抛出Exception2的内部方法。
建议的做法是什么?
感谢。
答案 0 :(得分:6)
您应该编写一个javadoc来解释抛出每个特定异常时的条件。例如,看看ReadableByteChannel.read() javadoc - 该方法在其throws子句中仅声明了IOException,但在其javadoc中描述了该异常的许多更具体的子类。
答案 1 :(得分:5)
只需在throws Exception2
子句中写throws
即可。如果调用者在catch (Exception1 e)
之前放置catch (Exception2 e)
,他们仍然可以单独捕获每个人。
例如,FileNotFoundException
是IOException
的子类型,可以写
try {
doSomeStuff();
} catch (FileNotFoundException e) {
System.out.println("There's no such file");
} catch (IOException e) {
System.out.println("Your IO doesn't work");
}
即使doSomeStuff()
仅被声明为投掷IOException
。但你不能反过来做到这一点。在子类的子类之前使用超类的catch
子句是无效的。
答案 2 :(得分:0)
Catch可能比名义上抛出的更具体,因此没有要求明确说明如果一个扩展另一个,你就扔掉了。这样做也没有坏处。根本不可能让另一个延伸到另一个......