请注意:调用者只会抛出 parentexception!!
假设aexception
和bexception
继承自parentexception
。
在方法af
中,它throw aexception
,bexception
和parentexception
。
void af() throws aexception, bexception, parentexception {}
方法 caller
调用 af
并且仅throw parentexception
。
void caller() throws parentexception
这里丢失了parentexception子类的信息。
方法rootCaller
调用方法caller
,rootcaller
只能catch parentexception
由caller抛出
并使用以下异常处理捕获 block :
void rootCaller() {
try {
caller();
} catch(parentexception e) {
if(e instanceof aexception) {
......
} else if(e instanceof bexception) {
......
} else if(e instanceof parentexception) {
......
} else {
......
}
}
如果子类太多,这太丑陋了,很容易忘记 parentexception 的一些子类。
有没有办法改进这样的代码?
目前的答案不能给我任何想法:
1、rootCaller不能使用multi-catch来简化流程,因为调用者只会抛出parentexception。
2、因为caller只抛出parentexception,如果af后面改成throws more than aexception和bexception,则没有任何其他异常检查,就说cexception。
最佳答案
正如其他人在评论中所建议的那样,您应该使用多个 catch 子句。
void rootCaller() {
try {
caller();
} catch (AException e) {
// ...
} catch (ParentException e) {
// ...
} catch (BException e) {
// ...
} catch (AnotherException e) {
// ...
} catch (Exception e) {
// ...
}
}
捕获的顺序也很重要。异常将依次针对每个案例进行测试,并且只会触发第一个匹配的案例。
例如,在我上面的代码中,AException
和 BException
扩展了 ParentException
catch (BException e)
永远无法到达 block ,因为首先到达并执行了 catch (ParentException e)
。
关于java - 如何使用异常 instanceof 改进丑陋的 catch block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23941683/