出于诊断目的,我有时需要存储导致给定状态转换的调用堆栈(例如授予锁定,提交事务等),以便稍后出现问题时我可以找出最初触发状态转换的人.
目前,我知道检索调用堆栈的唯一方法看起来像下面的代码片段,我认为非常难看:
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()
在当前线程上调用它,所以你可能更喜欢使用它.