web-dev-qa-db-ja.com

現在のコールスタックの決定(診断目的)

診断の目的で、特定の状態遷移(ロックの付与、トランザクションのコミットなど)につながるコールスタックを保存する必要がある場合があります。これにより、後で問題が発生したときに、誰が最初に状態遷移をトリガーしたかを知ることができます。

現在、コールスタックを取得するために私が知っている唯一の方法は、次のコードスニペットのようになります。これはひどく醜いと思います。

StackTraceElement[] cause;
try {
  throw new Exception();
} catch (Exception e) {
  cause = e.getStackTrace();
}

誰かがこれを達成するためのより良い方法を知っていますか?

私はあなたが同じことを得ることができると思います:

StackTraceElement[] cause = Thread.currentThread().getStackTrace();
84
bruno conde

さて、実際に例外をスローしないことで、少し改善することができます。

_Exception ex = new Exception();
ex.fillInStackTrace();
StackTraceElement[] cause = ex.getStackTrace();
_

実際、私はチェックしたばかりです。コンストラクターはすでにfillInStackTrace()を呼び出しています。したがって、次のように簡略化できます。

_StackTraceElement[] cause = new Exception().getStackTrace();
_

これは実際には Thread.getStackTrace() が現在のスレッドで呼び出された場合に実行されることなので、代わりに使用することをお勧めします。

13
Michael Myers

文字列として使用し、Apache Commonsを使用する場合:

org.Apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable())
3
Edward Anderson