web-dev-qa-db-ja.com

キャッチされた例外のスタックトレースを表示する方法

例外を出力する一般的な関数があります(log4jを使用)。

private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage() + ": " + e.getCause() + "\n" +  e.getStackTrace().toString());
}

私が見ているスタックトレースを見る代わりに:

[Ljava.lang.StackTraceElement;@49af7e68

例外のスタックトレースを適切に表示するにはどうすればよいですか?

更新

log.error(e)<-エラーを表示しますが、スタックトレースは表示しません

26
ufk
12
Guillaume

ロギングフレームワークは例外をログに記録する機能を備えている必要があるため、適切な.error(Object, Throwable)呼び出しに例外を渡すだけで十分です。

ロギングフレームワークでそれができない場合、または他の理由でStringのスタックトレースが必要な場合は、少し難しくなります。 PrintWriterをラップするStringWriterを作成し、Exception.printStackTrace()を呼び出す必要があります。

_StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
_
68
Joachim Sauer

やってみました?

private void _showErrorMessage(Exception e) {
    log.error("Hey! got an exception", e);
}
13
Paul McKenzie

Throwable.getStackTraceStackTraceElement sの配列を返すため、toStringメソッドは配列自体のテキスト表現を返します。

実際にスタックトレース情報を取得するには、各StackTraceElementを調べて詳細情報を取得する必要があります。

5
coobird

GoogleのGuavaライブラリもご覧ください。

Throwables.getStackTraceAsString(Throwable throwable)

4
gpampara

質問に対する正確な答えは、次のようにLog4Jを呼び出す必要があるということです。

private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage() + ": " + e.getCause(), e);
}

とにかくスタックトレースがそれを与えるので、私はe.getCause()の呼び出しを省略しますが、

private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage(), e);
}

スタックトレースの文字列が本当に必要な場合はExceptionUtilsで問題ありませんが、Log4Jを使用しているため、組み込みの例外処理を利用しないと多くの損失が発生します。

1
Yishai

Exception Stacktrace logging は、この目的で2つのメソッドを示しています。1つはApache Commonsに基づいており、もう1つは標準のJDKメソッドを使用しています。

1
Marco C.