链式异常
原文: https://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html
应用程序通常会通过抛出另一个异常来响应异常。实际上,第一个例外导致第二个例外。了解一个异常何时导致另一个异常非常有用。链式异常帮助程序员做到这一点。
以下是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
异常,并附加原始原因,并将异常链抛出到下一个更高级别的异常处理器。
访问堆栈跟踪信息
现在让我们假设更高级别的异常处理器想要以自己的格式转储堆栈跟踪。
Definition: A stack trace provides information on the execution history of the current thread and lists the names of the classes and methods that were called at the point when the exception occurred. A stack trace is a useful debugging tool that you’ll normally take advantage of when an exception has been thrown.
以下代码显示如何在异常对象上调用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() + "()");
}
}
记录 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());
}
}