Java 中将异常 StackTrace 转换为字符串
学习将 Java 异常堆栈跟踪转换为String。当我们想要在日志文件中打印堆栈跟踪或将日志存储在数据库中以进行审计时,从StackTrace到 String 的转换可能很有用。
请注意,Java 没有内置的直接 API 来获取String形式的堆栈跟踪。
1.使用StringWriter和PrintWriter
默认情况下,Throwable.printStackTrace()将异常回溯打印到标准错误流,即字段System.err的值。默认情况下,System.err打印到控制台。
我们可以使用重载方法printStackTrace(writer)将回溯打印到指定的 print Writer(例如PrintWriter ) 。此PrintWriter 的目标是StringWriter。
要使用StringWriter转换堆栈跟踪,请按照下列步骤操作
- 将可抛出的堆栈跟踪及其回溯打印到PrintWriter。
- 将打印编写器内容复制到StringWriter。
- 使用StringWriter.toString()以字符串形式获取堆栈跟踪。
我们使用try-with-resource来创建StringWriter
实例PrintWriter
,在处理完成时自动关闭两个编写器。
在下面的程序中,我们创建一个NullPointerException并在将其转换为String后打印其堆栈跟踪。
NullPointerException npe = new NullPointerException("Custom error"); String errorStr = null; try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) { npe.printStackTrace(pw); errorStr = sw.toString(); } catch (IOException e) { throw new RuntimeException("Error while converting the stacktrace"); } System.out.println(errorStr);
程序输出:
java.lang.NullPointerException: Custom error at com.howtodoinjava.demo.StackTrace.main(StackTrace.java:11)
2. 使用ExceptionUtils
Apache common langs3库有一个优秀的实用程序类ExceptionUtils。它的getStackTrace()方法返回任何 Java 异常的字符串表示形式。
2.1. Maven依赖
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
2.2. 例子
以下 Java 程序将堆栈跟踪复制到字符串中。
String errorStr = ExceptionUtils.getStackTrace(new NullPointerException("Custom error")); System.out.println(errorStr);
程序输出:
java.lang.NullPointerException: Custom error at com.howtodoinjava.demo.StringExample.main(StringExample.java:11)