54

出于诊断目的,我有时需要存储导致给定状态转换(例如授予锁、提交事务等)的调用堆栈,以便以后出现问题时,我可以找出最初触发状态转换的人。

目前,我知道检索调用堆栈的唯一方法类似于以下代码片段,我认为它非常难看:

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

有人知道实现此目的的更好方法吗?

4

4 回答 4

102

我认为你可以得到同样的东西:

StackTraceElement[] cause = Thread.currentThread().getStackTrace();
于 2009-04-01T16:17:32.667 回答
16

好吧,您可以通过不实际抛出异常来稍微改进它。

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

实际上,我刚刚检查过:构造函数已经调用fillInStackTrace()了。因此,您可以将其简化为:

StackTraceElement[] cause = new Exception().getStackTrace();

如果在当前线程上调用它,这实际上就是Thread.getStackTrace()这样做的,因此您可能更喜欢使用它。

于 2009-04-01T16:14:27.823 回答
3

如果您希望它作为字符串并使用 Apache Commons:

org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable())
于 2015-05-22T12:58:58.707 回答
2

自 JDK 9 以来有一个新选项:StackWalker

它不像 Thread.currentThread().getStackTrace() 那样昂贵。

另请参阅Thread.getStackTrace() 有多贵?

于 2020-06-26T07:49:27.050 回答