本教程适用于JDK 8。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及后续版本中更新的语言特性摘要。
请参阅JDK版本说明,了解所有JDK版本中的新功能、增强功能以及已删除或已弃用选项的信息。
应用程序通常通过抛出另一个异常来响应异常。实际上,第一个异常导致第二个异常。了解一个异常导致另一个异常是非常有帮助的。链式异常帮助程序员实现这一点。
以下是Throwable中支持链式异常的方法和构造函数。
Throwable getCause() Throwable initCause(Throwable) Throwable(String, Throwable) Throwable(Throwable)
initCause和Throwable构造函数中的Throwable参数是导致当前异常的异常。 getCause返回导致当前异常的异常,initCause设置当前异常的原因。
以下示例显示了如何使用链式异常。
try {
} catch (IOException e) {
throw new SampleException("其他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());
}
}