超过两层深度的嵌套方法异常捕获与处理规则咨询
结论1:当前代码场景下A的catch无法捕获C中产生的异常
Java异常会沿着方法调用栈自底向上传播,一旦某一层捕获异常后没有重新抛出,异常传播流程就会直接终止。你现有代码中C方法已经捕获了所有Exception,且仅执行日志打印、没有向外抛出异常,异常在C层就被完全消化,上层的B、A都感知不到异常发生,因此A的catch语句不可能捕获到对应异常。
结论2:要让A处理该异常,不需要在B中添加try-catch逻辑
仅需要修改C方法的异常处理逻辑,在打印日志后重新抛出异常即可。B方法不需要做任何额外处理,未被B捕获的异常会自动沿着调用栈向上传递到A层,被A的catch捕获。
修改后代码示例
public void A(){ try{ B(); } catch(Exception e){ // 此处可正常处理C层抛上来的异常 log.error("A层捕获到异常", e); // 你的异常处理逻辑... } } // B方法无需做任何修改,不需要加try-catch public void B(){ C(); } public void C(){ try{ some_stuff(); } catch(Exception e){ log.error("C层记录异常日志", e); // 重新抛出异常,触发上层传播逻辑 throw e; // 如果你抛出的是受检异常不想修改方法签名,也可以包装为运行时异常抛出: // throw new RuntimeException(e); } }
如果你额外在B层加了try-catch,反而会阻断异常传播,除非你在B的catch块中也做重新抛出操作,属于完全多余的操作。
内容的提问来源于stack exchange,提问作者Sami Şahin
相关产品推荐
相关产品推荐

