Ответ 1
Я думаю, вы можете получить то же самое:
StackTraceElement[] cause = Thread.currentThread().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())