Что происходит, когда мы говорим e.printStackTrace();
? Здесь e
является любым Exception
. Остановляет ли он нормальное выполнение и фактически удаляет записи активации из стека потоков, чтобы дать трассировку стека исключения? Это хорошая идея использовать его в приложениях?Исключение и трассировка стека
ответ
ли это остановить нормальное выполнение
No.
и фактически удалить записи активации из стека потока, чтобы дать трассировку стека, за исключением?
No.
В информации есть уже были взяты в плену. Это происходит в конструкторах для Throwable
; т. е. когда вы new
исключение, а не когда вы throw
это. Конструктор Throwable
вызывает собственный метод fillInStackTrace()
, который принимает моментальный снимок стека и сохраняет итоговый StackTraceElement[]
в частной переменной, которая используется позже при печати трассировки стека.
(Для записи, это указывается в Javadoc для конструкторов Throwable
.
Это хорошая идея, чтобы использовать его в приложениях?
Ну это довольно дорого и может привести к большому количеству выходных данных. Но если вы нуждаетесь в , то трассировка стека для диагностических целей ...
+1 Однако fillInStackTrace не заполняет закрытый массив в Sun JVM/JRE - это собственный метод, который делает то же самое (на стороне). getStackTrace извлекает исходные данные и сохраняет их в частном массиве. –
@pst - большинство людей считают, что 'fillInStackTrace()' (в широком смысле) выполняет работу. Кроме того, вызов частного родного метода представляет собой детальную реализацию конкретной платформы. –
e.printStackTrace();
e
является экземпляром Throwable
Этот метод печатает трассировку стека для этого Throwable объекта на выходной поток ошибок, который является значением системе поля. err
стандартная ошибка, нет стандартный мощность. Хотя в большинстве случаев это не имеет значения – AlexR
@AlexR да согласен –
Он просто печатает трассировку стека который уже удерживается объектом исключения для STDERR. Никаких побочных эффектов.
Небольшой побочный эффект заключается в том, что трассировка стека не заполняется до тех пор, пока не будет использована по соображениям производительности, обычно трассировка стека не используется. Он хранится где-то еще, но вы не можете видеть его в отладчике, пока он не будет использоваться в коде. –
@Peter Lawrey В другом месте, как в «где-то родном», но «где-то родной» обычно заполняется «fillInStackTrace», который уже имеет «стоимость» записи стека. Это просто «затраты» на то, чтобы вытащить его из этого родного места в объекты StackTraceElement, которые обойдены. –
Нет ничего особенно умного. Объект Exception
содержит список StackTraceElements, и он просто выгружает их в stderr, когда вызывается выше.
Это немного более умно, чем это ;-) Частный массив используется для сериализации * и * кеширования (он ленивый и «заглушен» на fillInStackTrace). Это включено (солнце) JVM/JRE и, скорее всего, будет лучше хранить кадры (-ы) стека и подвергать их с помощью собственного метода (я бы предположил, что в более эффективной не-объектной форме). См. Http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Throwable.java –
Как уже говорилось, побочных эффектов нет, и вы не будете вводить какие-либо проблемы с его использованием в производственном коде. Однако я бы не советовал это (в производственном коде) просто потому, что в большинстве приложений гораздо лучше использовать регистратор, чтобы получить более точное управление точно, что было зарегистрировано и где оно было зарегистрировано.
Трассировка стека загружается через fillInStackTrace
, который является нативным методом, который вызывается в конструкторе Throwable. (Аккуратный совет: этот метод может быть перегружен как NOP для «исключений сигнала», которым не нужен довольно дорогостоящий вызов для получения стека).
«Замерзание» трассировки стека уже существует для Throwable object, когда он «пойман».
В соответствии с кодом для java.lang.Throwable показано, что fillInStackTrace
называется первым действием конструктора. Массив StackTraceElement
предназначен для поддержки сериализации (это также можно установить вручную) и как ленивый кеш.
Несмотря на то, что fillInStackTrace
захватывает след это не загружается в Java объекты - Я полагаю, что это позволяет реализации держать его «дешево» - пока он не должен быть доступен в виде последовательности StackTraceElement
объектов (например, для printStackTrace
, который выполняется в Java-коде). Код для Throwable показывает это лучше, чем я могу объяснить :-)
Счастливое кодирование.
- 1. Исключение (трассировка стека) в одной строке
- 2. PDB: исключение в консоли - полная трассировка стека
- 3. SQLException трассировка стека
- 4. Исключительная трассировка стека
- 5. Трассировка стека после исключения catching
- 6. трассировка стека обфускации сборки
- 7. C трассировка кадров стека
- 8. ASP.NET Трассировка стека Вопрос
- 9. Трассировка стека отладки?
- 10. Трассировка стека ошибок компилятора
- 11. Трассировка стека исключений Javascript
- 12. Трассировка стека как строка
- 13. Трассировка стека в eclipse
- 14. Что такое трассировка стека?
- 15. Обработка исключений Java и трассировка стека
- 16. JBoss 5 - Дешифрирование Трассировка стека
- 17. .NET - трассировка стека стека с переменными
- 18. Может ли трассировка стека стека быть нулевым?
- 19. как отладить это исключение ClassCastException? (где трассировка стека кажется бесполезной)
- 20. Трассировка стека и извлечение основных аргументов
- 21. Perl: $ SIG {__ DIE__}, eval {} и трассировка стека
- 22. XCode 3.2.1 и инструменты: бесполезная трассировка стека
- 23. Трассировка стека запросов SQL-запроса
- 24. Linux Application Glibc Трассировка стека
- 25. Трассировка стека консоли разработчика Android
- 26. Трассировка стека Java в Windows
- 27. андроид: трассировка стека для уничтожения
- 28. mvn -e Полная трассировка стека?
- 29. Python3 «магические функции» Трассировка стека
- 30. Что означает эта трассировка стека?
Трассировка стека является стеком потоков, когда было создано исключение, а не там, где оно было напечатано/Журнал. –