Java:将异常的完整堆栈追踪信息保存到字符串中(详解)

在Java开发里,处理异常时用e.toString()或e.getMessage()无法获取异常堆栈全部信息,e.printStackTrace()只是将堆栈打印到标准错误输出流。若业务需将堆栈信息显示给用户,可利用Throwable类的重载方法,将代码封装成公共静态方法来获取堆栈全部信息。

在Java开发中,我们经常要处理各种异常,我们一般用e.toString()或e.getMessage()得到异常信息,但是有时候异常堆栈中会存在很多信息,比如用下面的代码抛出异常:
try {
// code throws SomeException
} catch (SomeException e) {
throw new MyException( "Caught some exception " , e);
}

这种情况下用e.toString()或e.getMessage()是无法得到全部信息的,只能得到栈顶的内容,Java API中说的很清楚:

这个时候我们可以用e.printStackTrace()方法打印堆栈追踪信息,但是查看API会发现,这个方法只是将堆栈打印到系统的标准错误输出流中:

如果我们的业务逻辑处理需要将堆栈信息显示给用户,就需要获取堆栈的全部信息,查看printStackTrace()方法的源码,我们发现它其实是调用了一个重载的方法:
public void printStackTrace() {
printStackTrace(System.err);
}

再看Throwable类的API,发现有三个重载方法:

第二个重载方法将数据以byte方式写入输出到流,比如System.out、System.err。
第三个重载方法可以将堆栈信息按字符输出到一个Writer中,这里我们使用Writer的一个子类StringWriter构建字符串:
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
e.printStackTrace(pw);
String stackTraceString = sw.getBuffer().toString();

​稍作简化,可以将这一段代码封装到一个公共静态方法内,便于调用:
public static String printStackTraceToString(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace( new PrintWriter(sw, true));
return sw.getBuffer().toString();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值