如何正确处理 catch 块中的嵌套异常

How to correctly handle nested exception inside catch block

我有以下代码,我试图了解如何正确处理 catch 块中的异常,以便抛出两个异常(mainExceptionanotherException),以防万一anotherException 的我们不会丢失来自 mainException 的信息。 代码也很难闻——这种 try-catch 用法是某种反模式吗?有没有 better/correct 方法来处理这种情况?

        try {
            -some code-
        } catch (RuntimeException mainException) {
            try {
                -another code-
            } catch (Exception anotherException) {
                throw anotherException;
            } finally {
                throw mainException;
            }
        }

在 Java 7 中,作为 try-with-resources 工作的一部分,Throwable class was extended with support for suppressed 例外,专门用于此类场景。

public static void main(String[] args) throws Exception {
    try {
        throw new RuntimeException("Foo");
    } catch (RuntimeException mainException) {
        try {
            throw new Exception("Bar");
        } catch (Exception anotherException) {
            mainException.addSuppressed(anotherException);
        }
        throw mainException;
    }
}

输出(堆栈跟踪)

Exception in thread "main" java.lang.RuntimeException: Foo
    at Test.main(Test.java:5)
    Suppressed: java.lang.Exception: Bar
        at Test.main(Test.java:8)