您的位置:首页 > 编程语言 > Java开发

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: