打印exception的堆栈跟踪
如何打印除stderr以外的stream的exception的堆栈跟踪? 我发现的一种方法是使用getStackTrace()并将整个列表打印到stream中。
Throwable.printStackTrace(..)
可以使用PrintWriter
或PrintStream
参数:
} catch (Exception ex) { ex.printStackTrace(new PrintStream(yourOutputStream)); }
也就是说,考虑使用像LOGFack或log4j这样的日志logging实现方式的SLF4J之类的日志logging界面。
不是美丽的,而是一个解决scheme:
StringWriter writer = new StringWriter(); PrintWriter printWriter = new PrintWriter( writer ); exception.printStackTrace( printWriter ); printWriter.flush(); String stackTrace = writer.toString();
Throwable.printStackTrace()有一个替代forms,它将打印stream作为参数。 http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream);
例如
catch(Exception e) { e.printStackTrace(System.out); }
这将打印堆栈跟踪,而不是std错误。
对于Android开发极简主义者: Log.getStackTraceString(exception)
Throwable类提供了两个名为printStackTrace
方法,一个接受PrintWriter
,另一个接受PrintStream
,将堆栈跟踪输出到给定的stream。 考虑使用其中之一。
我有一个方法可以帮助获取stackTrace
private static String getStackTrace(Exception ex) { StringBuffer sb = new StringBuffer(500); StackTraceElement[] st = ex.getStackTrace(); sb.append(ex.getClass().getName() + ": " + ex.getMessage() + "\n"); for (int i = 0; i < st.length; i++) { sb.append("\t at " + st[i].toString() + "\n"); } return sb.toString();
}
见javadoc
out = some stream ... try { } catch ( Exception cause ) { cause . printStrackTrace ( new PrintStream ( out ) ) ; }