使用嵌套异常是一种好习惯吗?

svz*_*svz 14 java exception-handling exception

这可能是一个广泛的问题,不是那种风格,但我仍然希望得到一些提示或指导方针.

我一直在查看一些遗留代码,并发现其中一部分具有嵌套3或4级异常的方法.
这被认为是正常的做法还是应该尽可能避免这种代码风格?如果应该避免,除了异常处理成本增加和可读性降低之外还有哪些负面影响?是否有通用的方法来重构代码以避免这种情况?

Rah*_*hul 16

我个人更喜欢以下意识形态

包裹异形异常

"外来"异常是Java API或第三方库抛出的异常.换句话说,您无法控制的异常.

最好捕获所有异常异常并将它们包装在适当的应用程序特定异常中.将外来异常转换为您自己的异常后,您可以按照自己喜欢的方式传播该异常.

Rethrowing Checked Exceptions可以获得凌乱

如果您的应用程序使用已检查的异常,则重新抛出原始异常意味着重新抛出它的方法也必须声明它.

越接近调用层次结构的顶部,将声明抛出的异常越多.除非你只是声明所有方法抛出异常.但是,如果您这样做,您也可以使用未经检查的异常,因为您实际上并没有从编译器异常检查中获得任何好处.

这就是为什么我更喜欢捕获非特定于应用程序的异常并将它们包装在特定于应用程序的异常中,然后再将它们传播到调用堆栈中.

包装指南:发生异常的上下文可能与异常本身的位置一样重要.应用程序中的给定位置可以通过不同的执行路径到达,并且如果发生错误,则执行路径可以影响错误的严重性和原因.

如果在向调用堆栈中向上传播异常时需要向异常添加上下文信息,则需要使用活动传播.换句话说,您需要在调用堆栈的路上在各个相关位置捕获异常,并在重新抛出或包装之前向其添加相关的上下文信息.

public void doSomething() throws SomeException{

    try{

        doSomethingThatCanThrowException();

    } catch (SomeException e){

       e.addContextInformation(“more info”);
       throw e;  //throw e, or wrap it – see next line.

       //throw new WrappingException(e, “more information”);

    } finally {
       //clean up – close open resources etc.
    }

}
Run Code Online (Sandbox Code Playgroud)