例外のスタックトレースを出力します


81

例外のスタックトレースをstderr以外のストリームに出力するにはどうすればよいですか?私が見つけた1つの方法は、getStackTrace()を使用して、リスト全体をストリームに出力することです。


例外トレースを文字列として取得する場合は、1つの文字列に結合できるオブジェクトのgetStackTrace配列を返すTrowable(Exception)のメソッドを呼び出すことができます(StackTraceElementそのオブジェクトのtoStringメソッドを使用してトレースの1行を取得します)。
jcubic 2013

回答:


62

Throwable.printStackTrace(..)PrintWriterまたはPrintStream引数を取ることができます:

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

とはいえ、LOGBacklog4jなどのロギング実装でSLF4Jなどのロガーインターフェイスを使用することを検討してください。


77

美しくはありませんが、それでも解決策は次のとおりです。

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

String stackTrace = writer.toString();

3
これは私が必要としていたものです(私はそれを使用して本当に汚れていると感じていますが!)
Henley Chiu 2013

77

引数として印刷ストリームを受け取る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エラーではなくstdoutに出力されます。


4
@FranklinYu、質問の要点は、彼がstderrに出力するのではなく、別の任意のストリームに出力することです。
マイクデッキ

9

アンドロイド開発ミニマリストの場合: Log.getStackTraceString(exception)


1
これを使用して任意のストリームに印刷することはできません。これは、ロガーが構成されている場合にのみ役立ちます。
rv 2015

私はこのミニマリストのアプローチが好きでしたが、私のslf4jではうまくいきませんでした:(
killjoy

7

Apache Commonsは、スタックトレースをスロー可能から文字列に変換するユーティリティを提供します。

使用法:

ExceptionUtils.getStackTrace(e)

完全なドキュメントについては、https://commons.apache.org/proper/commons-lang/javadocs/api-release/index.htmlを参照して ください。


この答えは非常に正しいように見えますが、質問に対する答えではありません。OPは、スタックトレースを別のストリームに出力する方法を尋ねました。
バーマン2018年

これはOPの質問に答えられないかもしれませんが、非常に確立された形式を使用して、文字列として例外を設定するための最良の方法だと思います。ありがとう!
クリントイーストウッド

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クラスには、という名前の2つの方法を提供しprintStackTrace、受け入れ1PrintWriterとにかかる1PrintStream指定されたストリームにスタックトレースを出力し、。これらのいずれかを使用することを検討してください。


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を使用してみることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.