Java:将异常的完整堆栈追踪信息保存到字符串中(详解)
2014-04-17 17:20
1271 查看
在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();
}
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();
}
相关文章推荐
- 如何将追踪到的堆栈错误信息完整的保存到log4j日志中
- 将Java异常信息保存到字符串中
- Java日志出现异常,但没有完整的堆栈信息
- 请问能否把程序运行时出现的异常堆栈信息也保存进log4j指定的日志文件中
- 解决Java抛出的异常,log中不含具体的堆栈信息
- 【ThinkingInJava】24、捕获一个异常之后抛出另外一个异常,并且希望吧原始的信息保存下来
- java打印异常中的堆栈信息
- Java如何将字符串信息保存到文本文档
- slf4j如何打印java异常堆栈信息throwable对象
- 打印java异常堆栈信息到日志文件
- java 取得异常堆栈信息
- 打印Java异常堆栈信息
- java:获取异常的堆栈信息
- python错误处理记录完整的异常堆栈信息
- 服务器异常堆栈信息不完整
- Java获取异常堆栈信息
- java异常堆栈信息丢失
- ju.taobao.com的异常信息,很难收集到的。今天遇到了,保存一下,留作日后分析堆栈。
- python错误处理记录完整的异常堆栈信息
- 获得Java异常的堆栈信息