请注意:来电者只会抛出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
caller
抛出void rootCaller() {
try {
caller();
} catch(parentexception e) {
if(e instanceof aexception) {
......
} else if(e instanceof bexception) {
......
} else if(e instanceof parentexception) {
......
} else {
......
}
}
并使用以下异常进程catch块:
{{1}}
如果子类太多,这是非常丑陋并且很容易忘记一些parentexception的子类。
无论如何都要改进这样的代码吗?
目前的答案不能给我任何想法:
1,rootCaller不能使用multi-catch来简化进程,导致调用者只抛出parentexception。
2,因为调用者只抛出parentexception,所以没有任何其他异常检查是否af被改为后者抛出超过aexception和bexception,比如说cexception。
答案 0 :(得分:7)
正如其他人在评论中所建议的那样,你应该使用多个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)
并首先执行