Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
应用程序通常会通过抛出另一个异常来响应异常。实际上,第一个异常 导致 第二个异常。知道一个异常何时导致另一个异常非常有用。Chained Exceptions (链式异常) 帮助程序员执行此操作。
以下是 Throwable 中支持链式异常的方法和构造函数。
Throwable getCause() Throwable initCause(Throwable) Throwable(String, Throwable) Throwable(Throwable)
initCause 和 Throwable 构造函数的 Throwable 参数是导致当前异常的异常。getCause 返回导致当前异常的异常,initCause 设置当前异常的原因。
以下示例显示如何使用链式异常。
try {
} catch (IOException e) {
throw new SampleException("Other IOException", e);
}
在此示例中,当捕获到 IOException 时,将创建一个新的 SampleException 异常,并附加原始原因,并将异常链抛出到下一个更高级别的异常处理程序。
现在让我们假设更高级别的异常处理程序想要以自己的格式转储堆栈跟踪。
以下代码显示如何在异常对象上调用 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() + "()");
}
}
下一个代码段记录了 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());
}
}