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