如何使用异常instanceof改进难看的catch块

use*_*687 1 java exception instanceof inherited

请注意:来电者只会抛出parentexception !!

aexception,并bexception继承自parentexception.

在方法af,它throws aexception,bexceptionparentexception.

void af() throws aexception, bexception, parentexception {}
Run Code Online (Sandbox Code Playgroud)

该方法caller调用afthrow parentexception只.

void caller() throws parentexception
Run Code Online (Sandbox Code Playgroud)

在这里,我们丢失了parentexception子类的信息.

该方法rootCaller调用该方法caller,rootcaller并且只能catch parentexception抛出caller并使用以下异常进程catch块:

void rootCaller() {
    try {
        caller(); 
    } catch(parentexception e) {
    if(e instanceof aexception) {
        ......
    } else   if(e instanceof bexception) {
        ......
    } else   if(e instanceof parentexception) {
        ......
    } else {
    ......
    }
}
Run Code Online (Sandbox Code Playgroud)

如果子类太多,这是如此丑陋并且很容易忘记一些parentexception的子类.

反正有没有改进这样的代码?

目前的答案不能给我任何想法:

1,rootCaller不能使用multi-catch来简化进程,导致调用者只抛出parentexception.

2,因为调用者只抛出parentexception,所以没有任何其他异常检查af是否被改为后者抛出超过aexception和bexception,比如说cexception.

ind*_*ble 7

正如其他人在评论中建议的那样,您应该使用多个catch子句.

void rootCaller() {
    try {
        caller();
    } catch (AException e) {
        // ...
    } catch (ParentException e) {
        // ...
    } catch (BException e) {
        // ...
    } catch (AnotherException e) {
        // ...
    } catch (Exception e) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

渔获量的顺序也很重要.将依次针对每个案例测试异常,并仅触发匹配的第一个案例.

因此,例如在上面的代码中使用AExceptionBException扩展ParentException,catch (BException e)永远不会catch (ParentException e)到达并首先执行块.