# 链式异常

> 原文： [https://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html](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`](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html) 包中的日志记录工具将输出发送到文件。

```
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());
    }
}

```