文档

Java™ 教程-Java Tutorials 中文版
链式异常
Trail: Essential Classes
Lesson: Exceptions
Section: How to Throw Exceptions

链式异常

应用程序通常会通过抛出另一个异常来响应异常。实际上,第一个异常 导致 第二个异常。知道一个异常何时导致另一个异常非常有用。Chained Exceptions (链式异常) 帮助程序员执行此操作。

以下是 Throwable 中支持链式异常的方法和构造函数。

Throwable getCause()
Throwable initCause(Throwable)
Throwable(String, Throwable)
Throwable(Throwable)

initCauseThrowable 构造函数的 Throwable 参数是导致当前异常的异常。getCause 返回导致当前异常的异常,initCause 设置当前异常的原因。

以下示例显示如何使用链式异常。

try {

} catch (IOException e) {
    throw new SampleException("Other IOException", e);
}

在此示例中,当捕获到 IOException 时,将创建一个新的 SampleException 异常,并附加原始原因,并将异常链抛出到下一个更高级别的异常处理程序。

访问堆栈跟踪信息

现在让我们假设更高级别的异常处理程序想要以自己的格式转储堆栈跟踪。


定义: stack trace 提供有关当前线程执行历史记录的信息,并列出发生异常时调用的类和方法的名称。堆栈跟踪是一种有用的调试工具,通常在抛出异常时会利用它。

以下代码显示如何在异常对象上调用 getStackTrace 方法。

catch (Exception cause) {
    StackTraceElement elements[] = cause.getStackTrace();
    for (int i = 0, n = elements.length; i < n; i++) {       
        System.err.println(elements[i].getFileName()
            + ":" + elements[i].getLineNumber() 
            + ">> "
            + elements[i].getMethodName() + "()");
    }
}

Logging API

下一个代码段记录了 catch 块中发生异常的位置。但是,它不是手动解析堆栈跟踪并将输出发送到 System.err(),而是使用 java.util.logging 包中的日志记录工具将输出发送到文件。

try {
    Handler handler = new FileHandler("OutFile.log");
    Logger.getLogger("").addHandler(handler);
    
} catch (IOException e) {
    Logger logger = Logger.getLogger("package.name"); 
    StackTraceElement elements[] = e.getStackTrace();
    for (int i = 0, n = elements.length; i < n; i++) {
        logger.log(Level.WARNING, elements[i].getMethodName());
    }
}

Previous page: How to Throw Exceptions
Next page: Creating Exception Classes