例外を出力する一般的な関数があります(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)<-エラーを表示しますが、スタックトレースは表示しません
ロギングフレームワークは例外をログに記録する機能を備えている必要があるため、適切な.error(Object, Throwable)
呼び出しに例外を渡すだけで十分です。
Java.util.logging
_ それができるロギングフレームワークでそれができない場合、または他の理由でString
のスタックトレースが必要な場合は、少し難しくなります。 PrintWriter
をラップするStringWriter
を作成し、Exception
で.printStackTrace()
を呼び出す必要があります。
_StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
_
やってみました?
private void _showErrorMessage(Exception e) {
log.error("Hey! got an exception", e);
}
Throwable.getStackTrace
は StackTraceElement
sの配列を返すため、toString
メソッドは配列自体のテキスト表現を返します。
実際にスタックトレース情報を取得するには、各StackTraceElement
を調べて詳細情報を取得する必要があります。
GoogleのGuavaライブラリもご覧ください。
Throwables.getStackTraceAsString(Throwable throwable)
質問に対する正確な答えは、次のように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を使用しているため、組み込みの例外処理を利用しないと多くの損失が発生します。
Exception Stacktrace logging は、この目的で2つのメソッドを示しています。1つはApache Commonsに基づいており、もう1つは標準のJDKメソッドを使用しています。