请注意:呼叫者仅引发parentexception !!
假设aexception
和bexception
从parentexception
继承。
在方法af
中,它是throws aexception
,bexception
和parentexception
。
void af() throws aexception, bexception, parentexception {}
方法
caller
仅调用af
和throw parentexception
。void caller() throws parentexception
在这里,我们丢失了parentexception子类的信息。
方法
rootCaller
调用方法caller
,并且rootcaller
只能由catch parentexception
并使用以下异常过程catch块抛出caller
: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不能使用多重捕获来简化进程,因为调用方只能抛出parentexception。
2,由于调用方仅抛出parentexception,因此没有其他任何异常检查将af更改为后者后抛出的异常比abception和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)
块,因为先到达并执行了catch (ParentException e)
。