Исключение и трассировка стека - PullRequest
0 голосов
/ 10 февраля 2011

Что происходит, когда мы говорим e.printStackTrace();? Здесь e - это любое Exception. Останавливает ли это нормальное выполнение и фактически удаляет записи активации из стека потока, чтобы дать трассировке стека исключение? Это хорошая идея использовать его в приложениях?

Ответы [ 6 ]

4 голосов
/ 10 февраля 2011

Он просто печатает трассировку стека, которая уже хранится объектом исключения, в STDERR. Никаких побочных эффектов.

3 голосов
/ 10 февраля 2011

Ничего особенно умного не происходит. Объект Exception содержит список StackTraceElements и просто выдает их в stderr при вызове вышеупомянутого.

3 голосов
/ 10 февраля 2011

e.printStackTrace();

e является экземпляром Throwable

и printStackTrace()

Этот метод печатает трассировку стека для этого объекта Throwable в потоке вывода ошибок, который является значением поля System.err

2 голосов
/ 10 февраля 2011

Останавливает ли это нормальное выполнение

номер

и фактически удалить записи активации из стека потоков, чтобы дать трассировке стека исключение?

Нет.

Информация уже была захвачена. Это происходит в конструкторах для Throwable; то есть когда вы new исключение, а не когда вы throw оно. Конструктор Throwable вызывает собственный метод fillInStackTrace(), который делает снимок стека и сохраняет результирующий StackTraceElement[] в закрытой переменной, которая используется позже при печати трассировки стека.

(Для справки, это указано в javadoc для конструкторов Throwable.

Это хорошая идея использовать его в приложениях?

Ну, это довольно дорого и может дать много продукции. Но если вам нужно трассировка стека для диагностических целей ... сделайте это.

0 голосов
/ 10 февраля 2011

Трассировка стека загружается через fillInStackTrace, который является собственным методом, который вызывается в конструкторе Throwable. (Полезный совет: этот метод может быть перегружен как NOP для «исключений сигналов», которым не требуется достаточно дорогой вызов для получения стека).

«Замораживание» трассировки стека уже существует для объекта Throwable, когда он «пойман».

Согласно коду для java.lang.Throwable показывает, что fillInStackTrace вызывается как первое действие конструктора. Массив StackTraceElement предназначен для поддержки сериализации (это также можно установить вручную) и в качестве отложенного кэша.

Несмотря на то, что fillInStackTrace фиксирует трассировку, она не загружена в объекты Java - я полагаю, это позволяет реализации сохранять ее «дешевой» - до тех пор, пока к ней не нужно будет обращаться как к последовательности StackTraceElement объектов (например, для printStackTrace, что сделано в коде Java). Код Throwable показывает это лучше, чем я могу объяснить: -)

Счастливого кодирования.

0 голосов
/ 10 февраля 2011

Как уже говорилось, никаких побочных эффектов нет, и вы сами не будете сталкиваться с проблемами при использовании его в рабочем коде.Однако я бы не советовал это (в производственном коде) просто потому, что в большинстве приложений гораздо лучше использовать регистратор для более точного контроля того, что именно регистрируется и в каком месте он регистрируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...