2011-02-10 3 views
0

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

+1

Трассировка стека является стеком потоков, когда было создано исключение, а не там, где оно было напечатано/Журнал. –

ответ

2

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

No.

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

No.

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

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

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

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

+0

+1 Однако fillInStackTrace не заполняет закрытый массив в Sun JVM/JRE - это собственный метод, который делает то же самое (на стороне). getStackTrace извлекает исходные данные и сохраняет их в частном массиве. –

+0

@pst - большинство людей считают, что 'fillInStackTrace()' (в широком смысле) выполняет работу. Кроме того, вызов частного родного метода представляет собой детальную реализацию конкретной платформы. –

3

e.printStackTrace();

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

и printStackTrace()

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

+0

стандартная ошибка, нет стандартный мощность. Хотя в большинстве случаев это не имеет значения – AlexR

+0

@AlexR да согласен –

4

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

+0

Небольшой побочный эффект заключается в том, что трассировка стека не заполняется до тех пор, пока не будет использована по соображениям производительности, обычно трассировка стека не используется. Он хранится где-то еще, но вы не можете видеть его в отладчике, пока он не будет использоваться в коде. –

+0

@Peter Lawrey В другом месте, как в «где-то родном», но «где-то родной» обычно заполняется «fillInStackTrace», который уже имеет «стоимость» записи стека. Это просто «затраты» на то, чтобы вытащить его из этого родного места в объекты StackTraceElement, которые обойдены. –

3

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

+0

Это немного более умно, чем это ;-) Частный массив используется для сериализации * и * кеширования (он ленивый и «заглушен» на fillInStackTrace). Это включено (солнце) JVM/JRE и, скорее всего, будет лучше хранить кадры (-ы) стека и подвергать их с помощью собственного метода (я бы предположил, что в более эффективной не-объектной форме). См. Http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Throwable.java –

0

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

0

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

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

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

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

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

Смежные вопросы