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

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

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

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

Кто-нибудь знает лучший способ сделать это?

Ответы [ 3 ]

83 голосов
/ 01 апреля 2009

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

StackTraceElement[] cause = Thread.currentThread().getStackTrace();
12 голосов
/ 01 апреля 2009

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

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

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

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

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

3 голосов
/ 22 мая 2015

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

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