Java 将堆栈跟踪转换为字符串
1 简介
在处理Java中的异常时,我们经常需要记录或只显示堆栈跟踪。
但是,有时候,我们不希望只打印堆栈跟踪,我们可能需要将堆栈跟踪写入文件,数据库甚至通过网络传输。
出于这些目的,将堆栈跟踪作为String将非常有用。
不幸的是,Java并没有提供一种非常方便的方法来直接实现这一点。
2.使用Java SE API进行转换
让我们Java SE API开始。
Exception类的printStackTrace()方法可以接受一个PrintStream或PrintWriter的参数,
因此,我们可以使用StringWriter将堆栈跟踪打印到String中:
@Test
public void test_StackTraceToStringByStringWriter(){
try {
throw new NullPointerException();
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
System.out.println(sw.toString());
}
}
然后,调用sw.toString()将返回包含堆栈跟踪信息的String了。
3. 使用Commons-Lang的工具类进行转换
虽然前面的方法是使用核心Java 将堆栈跟踪转换为String的最简单方法,但它仍然有点麻烦。
幸运的是,Apache Commons-Lang提供了一个完成这项工作的功能。
Apache Commons-Lang是一个非常有用的库,它提供了许多Java API核心类中缺少的功能,包括可用于处理异常的类。
首先,让我们从项目配置开始。使用Maven时,我们只需要将以下依赖项添加到pom.xml:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
然后,使用ExceptionUtils工具类从Exception中将堆栈跟踪作为String:
@Test
public void test_StackTraceToStringByExceptionUtils(){
try {
throw new IndexOutOfBoundsException();
} catch (Exception e) {
System.out.println(ExceptionUtils.getStackTrace(e));
}
}
4. 结论
本文介绍了两种方式,将异常的堆栈跟踪转换为String。
- 使用Java SE API
- 使用Apache Commons-Lang的方法。
但是,Java 9带来一个新的StackWalking API,它可以使事情变得更容易。这个以后会专门写一篇文章和大家分享。