异常链

应用程序通常会通过抛出另一个异常来响应异常。 实际上,第一个异常引起第二个异常。 它可以是非常有助于用户知道什么时候一个异常导致另一个异常。 “异常链(Chained Exceptions)”帮助程序员做到这一点。

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

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

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

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

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

在此示例中,当捕获到IOException时,将创建一个新的SampleException异常,并附加原始的异常原因,并将异常链抛出到下一个更高级别的异常处理程序。

访问堆栈跟踪信息

现在让我们假设更高级别的异常处理程序想要以自己的格式转储堆栈跟踪。

定义:堆栈跟踪(stack trace)提供有关当前线程的执行历史的信息,并列出在异常发生时调用的类和方法的名称。 堆栈跟踪是一个有用的调试工具,通常在抛出异常时会利用它。

以下代码显示了如何在异常对象上调用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. }