1

请注意:调用者只抛出父异常!!

这么说aexception,并bexception继承自parentexception

在方法中,af它和。throws aexceptionbexceptionparentexception

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

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

如果子类太多,这很丑陋并且很容易忘记某些父异常的子类。

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

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

1、rootCaller不能使用multi-catch来简化流程导致caller只抛出parentexception。

2、因为调用者只抛出parentexception,所以没有任何其他的异常检查,如果将af改成throw多于aexception和beexception,比如cexception。

4

1 回答 1

7

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

void rootCaller() {
    try {
        caller();
    } catch (AException e) {
        // ...
    } catch (ParentException e) {
        // ...
    } catch (BException e) {
        // ...
    } catch (AnotherException e) {
        // ...
    } catch (Exception e) {
        // ...
    }
}

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

因此,例如,在我上面的代码中使用AExceptionBException扩展该块永远无法达到并首先执行。ParentExceptioncatch (BException e)catch (ParentException e)

于 2014-05-29T19:57:47.737 回答