打印异常的堆栈跟踪

时间:2011-07-25 22:10:51

标签: java exception

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

9 个答案:

答案 0 :(得分:71)

还有一种Throwable.printStackTrace()的替代形式,它将打印流作为参数。 http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html#printStackTrace(java.io.PrintStream)

E.g。

catch(Exception e) {
    e.printStackTrace(System.out);
}

这会将堆栈跟踪打印到std out而不是std错误。

答案 1 :(得分:70)

不漂亮,但仍然是一个解决方案:

StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
exception.printStackTrace( printWriter );
printWriter.flush();

String stackTrace = writer.toString();

答案 2 :(得分:57)

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

} catch (Exception ex) {
    ex.printStackTrace(new java.io.PrintStream(yourOutputStream));
}

也就是说,考虑使用像SLF4J这样的记录器界面和LOGBacklog4j等日志记录实现。

答案 3 :(得分:8)

对于android dev极简主义者:{{1}}

答案 4 :(得分:3)

我创建了一个有助于获取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();
}

答案 5 :(得分:2)

Throwable类提供了两个名为printStackTrace的方法,一个接受PrintWriter的方法和一个接收PrintStream的方法,它将堆栈跟踪输出到给定的流。考虑使用其中之一。

答案 6 :(得分:1)

请参阅javadoc

out = some stream ...
try
{
}
catch ( Exception cause )
{
      cause . printStrackTrace ( new PrintStream ( out ) ) ;
}

答案 7 :(得分:1)

Apache commons提供了将堆栈跟踪从throwable转换为string的实用程序。

用法:

ExceptionUtils.getStackTrace(e)

有关完整文档,请参阅 https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html

答案 8 :(得分:0)

如果您对更紧凑的堆栈跟踪感兴趣,其中包含更多类似以下信息(包详细信息):

  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]

您可以尝试使用Throwables.writeTo库中的spf4j