打印异常的堆栈跟踪


81

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


如果要以String形式获取异常跟踪,则可以调用getStackTraceTrowable方法(该Exception),该方法将返回StackTraceElement可以组合为一个String的对象数组(使用该对象的toString方法获得一行跟踪)。
jcubic

Answers:


61

Throwable.printStackTrace(..)可以接受PrintWriteror或PrintStream参数:

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

也就是说,请考虑将SLF4J之类的记录器接口与LOGBacklog4j之类的记录实现一起使用。


77

虽然不漂亮,但是还是有解决方案的:

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

String stackTrace = writer.toString();

3
这就是我需要的(即使我觉得使用它真的很脏!)
Henley Chiu


9

对于android开发极简主义者: Log.getStackTraceString(exception)


1
您不能使用它来打印到任意流。仅当您配置了记录器时,它才有用。
RV

我喜欢这种简约的方法,但它与我的SLF4J :(没果冻
煞风景

7

Apache commons提供了实用程序,可将堆栈跟踪从可抛出转换为字符串。

用法:

ExceptionUtils.getStackTrace(e)

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


虽然这个答案看起来非常正确,但这不是对问题的答案。OP询问他如何将堆栈跟踪信息打印到另一个流。
Buurman

即使这可能无法回答OP的问题,但我认为这是使用非常完善的格式将异常作为String的最佳方式。谢谢!
克林特·伊斯特伍德

7

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

3

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


1

javadoc

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

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]

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.