请注意:呼叫者仅引发parentexception !!

假设aexceptionbexceptionparentexception继承。

在方法af中,它是throws aexceptionbexceptionparentexception

void af() throws aexception, bexception, parentexception {}


方法caller仅调用afthrow 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) {
        // ...
    }
}


捕获的顺序也很重要。异常将依次针对每种情况进行测试,并且只会触发第一个匹配的情况。

因此,例如,在我上面的代码中使用AExceptionBException扩展ParentException时,就无法访​​问catch (BException e)块,因为先到达并执行了catch (ParentException e)

10-01 06:39