链式异常

原文: https://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html

应用程序通常会通过抛出另一个异常来响应异常。实际上,第一个例外导致第二个例外。了解一个异常何时导致另一个异常非常有用。链式异常帮助程序员做到这一点。

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

  1. Throwable getCause()
  2. Throwable initCause(Throwable)
  3. Throwable(String, Throwable)
  4. Throwable(Throwable)

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

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

  1. try {
  2. } catch (IOException e) {
  3. throw new SampleException("Other IOException", e);
  4. }

在此示例中,当捕获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方法。

  1. catch (Exception cause) {
  2. StackTraceElement elements[] = cause.getStackTrace();
  3. for (int i = 0, n = elements.length; i < n; i++) {
  4. System.err.println(elements[i].getFileName()
  5. + ":" + elements[i].getLineNumber()
  6. + ">> "
  7. + elements[i].getMethodName() + "()");
  8. }
  9. }

记录 API

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

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