我刚才有机会使用第三方API。它有一个父类异常FooException
,它有多个子类异常。
FooException
|
--- BarException
--- BuzException
--- ZapException
我必须调用此库中的方法名称run
,此方法抛出FooException
但我决定让调用者处理它但是我需要捕获特定的子类异常BarException
。如果它被捕获,那么我必须忽略它然后继续for循环。对于所有其他子类异常被抛出然后让调用者必须正确捕获/处理它们。
public void handleGracefully() throws FooException {
for(......) {
try {
3rdPartyAPI.run();
} catch (BarException be) { } // silently ignore
}
}
基于我对Java异常的有限理解,BarException
应该在catch块中捕获,而不是由其父异常类FooException
抛出。我理解正确吗?
答案 0 :(得分:0)
你对这个概念的理解是正确的。
写下这一行:
public void handleGracefully() throws FooException {
你基本上是在说你的编译器"每当有人试图调用这个函数时,你必须要抓住FooException
"。如果你抓到BarException
,则会抛出BarException
,而不是他的父母。
请考虑以下代码:
public class MainClass {
public static void main(String[] args) {
try {
handleGracefully();
} catch (FooException e) {
System.out.println("World is not that cool");
}
}
public static void handleGracefully() throws FooException {
try {
hello();
} catch (BarException be) {
System.out.println("Hello world");
}
}
public static void hello() throws BarException {
throw new BarException("NYAAH");
}
}
结果:
Hello world
运行此MainClass
,您将看到您永远不会遇到World is not that cool
。相反,您将在控制台日志中遇到Hello world
。在throw
处理中添加BarException
声明会触发main()
日志记录:
public static void handleGracefully() throws FooException {
try {
hello();
} catch (BarException be) {
System.out.println("Hello world");
throw new FooException("BLEEEEH");
}
}
结果:
Hello world
World is not that cool
POST SCRIPTUM
无论如何,如果这个答案中的某些内容是错误的(例如与方法的static
值有关,或者任何使我的假设成错的事情),请随意指出。