深度超过 2 层的嵌套方法中的异常处理

Exception handling in nested methods with more than 2 levels deep

假设我们有嵌套的方法 A、B 和 C,如下所示:

public void A(){
    try{
        B();
    }
    catch(Exception e){
        log.error(e);
    }
}

public void B(){
    C();
}

public void C(){
    try{
        some_stuff();
    }
    catch(Exception e){
        log.error(e)
    }
}

因为我在C()捕获了异常,只用logging来处理,而B()没有任何catch,我是否在A()捕获异常?

或者我应该在 C() 处抛出异常并在 B() 处添加一个 try catch 以便能够在 A() 中处理它?

当你做的时候

public void C(){
    try{
        some_stuff();
    }
    catch(Exception e){
        log.error(e)
    }
}

此时将处理异常。您将记录它并忽略异常。如果要记录并向上传播,则需要从 catch 子句中重新抛出。

由于检查了异常(据我所知),您需要更改方法签名以指示您从 C.

中抛出此异常

B时不需要处理,只需更改方法签名即可表明该方法抛出Exception。

阅读更多关于 Java 检查异常与未检查异常的信息 enter link description here

最后,如果您想传播到 A,代码将如下所示:

public void A(){
    try{
        B();
    }
    catch(Exception e){
        log.error(e);
    }
}

public void B() throws Exception{
    C();
}

public void C() throws Exception{
    try{
        some_stuff();
    }
    catch(Exception e){
        log.error(e)
        throw e;
    }
}

您正在处理 catch 块中的异常,因此它不会进一步传播给调用者。这与您是记录它还是用它做任何其他事情无关。如果你想将它传播给调用者,你需要重新抛出它:

[...]
catch (Exception e) {
   // do something
   throw e;
}

如何处理异常取决于代码的设计。