出于诊断目的,我有时需要存储导致给定状态转换(例如授予锁、提交事务等)的调用堆栈,以便以后出现问题时,我可以找出最初触发状态转换的人。
目前,我知道检索调用堆栈的唯一方法类似于以下代码片段,我认为它非常难看:
StackTraceElement[] cause;
try {
throw new Exception();
} catch (Exception e) {
cause = e.getStackTrace();
}
有人知道实现此目的的更好方法吗?
出于诊断目的,我有时需要存储导致给定状态转换(例如授予锁、提交事务等)的调用堆栈,以便以后出现问题时,我可以找出最初触发状态转换的人。
目前,我知道检索调用堆栈的唯一方法类似于以下代码片段,我认为它非常难看:
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())
自 JDK 9 以来有一个新选项:StackWalker
它不像 Thread.currentThread().getStackTrace() 那样昂贵。