打印exception的堆栈跟踪

如何打印除stderr以外的stream的exception的堆栈跟踪? 我发现的一种方法是使用getStackTrace()并将整个列表打印到stream中。

Throwable.printStackTrace(..)可以使用PrintWriterPrintStream参数:

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