如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。
Answers:
虽然不漂亮,但是还是有解决方案的:
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
exception.printStackTrace( printWriter );
printWriter.flush();
String stackTrace = writer.toString();
还有Throwable.printStackTrace()的另一种形式,它以打印流作为参数。http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)
例如
catch(Exception e) {
e.printStackTrace(System.out);
}
这会将堆栈跟踪打印到std而不是std错误。
Apache commons提供了实用程序,可将堆栈跟踪从可抛出转换为字符串。
用法:
ExceptionUtils.getStackTrace(e)
有关完整的文档,请参阅 https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html
我创建了一个有助于获取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();
}
该Throwable的类提供了一个名为两个方法printStackTrace
,一个接受一个PrintWriter
,而另一种在一个PrintStream
,输出堆栈跟踪给定流。考虑使用其中之一。
如果您对更紧凑的堆栈跟踪感兴趣,其中包含更多信息(程序包详细信息),如下所示:
java.net.SocketTimeoutException:Receive timed out
at j.n.PlainDatagramSocketImpl.receive0(Native Method)[na:1.8.0_151]
at j.n.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)[^]
at j.n.DatagramSocket.receive(DatagramSocket.java:812)[^]
at o.s.n.SntpClient.requestTime(SntpClient.java:213)[classes/]
at o.s.n.SntpClient$1.call(^:145)[^]
at ^.call(^:134)[^]
at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:124)[^]
at o.s.f.RetryPolicy.call(RetryPolicy.java:105)[^]
at o.s.f.SyncRetryExecutor.call(SyncRetryExecutor.java:59)[^]
at o.s.n.SntpClient.requestTimeHA(SntpClient.java:134)[^]
at ^.requestTimeHA(^:122)[^]
at o.s.n.SntpClientTest.test2h(SntpClientTest.java:89)[test-classes/]
at s.r.NativeMethodAccessorImpl.invoke0(Native Method)[na:1.8.0_151]
您可以尝试从spf4j库使用Throwables.writeTo。
getStackTrace
Trowable方法(该Exception),该方法将返回StackTraceElement
可以组合为一个String的对象数组(使用该对象的toString方法获得一行跟踪)。