【问题标题】:Print the stack trace of an exception打印异常的堆栈跟踪
【发布时间】:2011-07-25 22:10:50
【问题描述】:

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

【问题讨论】:

  • 如果您想以字符串形式获取异常跟踪,您可以调用 Trowable(异常)的 getStackTrace 方法,该方法将返回您可以组合成一个字符串的 StackTraceElement 对象数组(使用 toString 方法该对象的一个​​跟踪线)。

标签: java exception


【解决方案1】:

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

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

String stackTrace = writer.toString();

【讨论】:

  • 这正是我所需要的(虽然我觉得用起来很脏!)
【解决方案2】:

还有另一种形式的 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);
}

这会将堆栈跟踪打印到标准输出而不是标准错误。

【讨论】:

  • @FranklinYu,问题的关键在于他不想打印到标准错误,而是打印到另一个任意流。
【解决方案3】:

Throwable.printStackTrace(..) 可以接受 PrintWriterPrintStream 参数:

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

也就是说,考虑使用像 SLF4J 这样的记录器接口和像 LOGBacklog4j 这样的记录实现。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 您不能使用它来打印到任意流。仅当您配置了记录器时才有用。
    • 我喜欢这种极简主义的方法,但它并不适合我的 slf4j :(
    【解决方案5】:

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

    用法:

    ExceptionUtils.getStackTrace(e)
    

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

    【讨论】:

    • 虽然这个答案看起来非常正确,但它不是问题的答案。 OP 询问他如何将堆栈跟踪打印到另一个流。
    • 尽管这可能无法回答 OP 的问题,但我认为这是使用非常完善的格式将异常作为字符串的最佳方式。谢谢!
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        javadoc

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

        【讨论】:

          【解决方案9】:

          如果您对包含更多信息(包详细信息)的更紧凑的堆栈跟踪感兴趣,如下所示:

            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

          【讨论】:

            猜你喜欢
            • 2012-09-04
            • 2011-01-18
            • 2010-09-18
            • 1970-01-01
            • 2014-08-06
            • 1970-01-01
            • 2012-01-03
            • 2011-01-05
            • 2010-09-25
            相关资源
            最近更新 更多