診断の目的で、特定の状態遷移(ロックの付与、トランザクションのコミットなど)につながるコールスタックを保存する必要がある場合があります。これにより、後で問題が発生したときに、誰が最初に状態遷移をトリガーしたかを知ることができます。
現在、コールスタックを取得するために私が知っている唯一の方法は、次のコードスニペットのようになります。これはひどく醜いと思います。
StackTraceElement[] cause;
try {
throw new Exception();
} catch (Exception e) {
cause = e.getStackTrace();
}
誰かがこれを達成するためのより良い方法を知っていますか?
私はあなたが同じことを得ることができると思います:
StackTraceElement[] cause = Thread.currentThread().getStackTrace();
さて、実際に例外をスローしないことで、少し改善することができます。
_Exception ex = new Exception();
ex.fillInStackTrace();
StackTraceElement[] cause = ex.getStackTrace();
_
実際、私はチェックしたばかりです。コンストラクターはすでにfillInStackTrace()
を呼び出しています。したがって、次のように簡略化できます。
_StackTraceElement[] cause = new Exception().getStackTrace();
_
これは実際には Thread.getStackTrace()
が現在のスレッドで呼び出された場合に実行されることなので、代わりに使用することをお勧めします。
文字列として使用し、Apache Commonsを使用する場合:
org.Apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable())