Подтвердить что ты не робот

Определение текущего стека вызовов (для диагностических целей)

В диагностических целях мне иногда приходится хранить стек вызовов, которые приводят к определенному переходу состояния (например, предоставление блокировки, совершение транзакции и т.д.), так что, когда что-то пойдет не так, я могу узнать, кто изначально вызвал переход состояния.

В настоящее время единственный способ получить стек вызовов выглядит следующим образом: фрагмент кода, который я считаю ужасно уродливым:

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

Знает ли кто-нибудь лучший способ достичь этого?

4b9b3361

Ответ 1

Я думаю, вы можете получить то же самое:

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

Ответ 2

Ну, вы можете немного улучшить его, не исключив при этом исключение.

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

Собственно, я только что проверил: конструктор уже называет fillInStackTrace(). Поэтому вы можете упростить его:

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

На самом деле это Thread.getStackTrace(), если он вызвал текущий поток, поэтому вы можете предпочесть его использовать.

Ответ 3

Если вы хотите, чтобы это было как строка и использовало Apache Commons:

org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(new Throwable())