Что такое трассировка стека?
4 года назад
Ivan Gagarinov
Ответы
Трассировка стека в выводе - это отчет, в котором содержится информация о вложенности внутри функций относительно момента, когда произошел выброс исключения. Чтобы лучше понять, рассмотрим пример:
В коде у нас три функции, каждая из которых вызывает другую, последняя (func1) внутри выбрасывает ошибку. Получается такая цепочка вызовов: func3 -> func2 -> func1. Внутри блока try catch мы поймали ошибку и распечатали. По ней видно, что текст ошибки содержит не только то значение, переданное в Error(), но и имена функций, номера строк и позиций в строках, в которых была выброшена ошибка. Это и есть трассировка стека. По нему можно понять, что ошибка была внутри функции func1(), строка 3, позиция 9. Эта функция была вызвана внутри функции func2(), строка 8, позиция 3. Функция 2 была вызвана внутри func3(), строка 13, позиция 3. А функция func3() была вызвана на строке 17, позиция 3. Позиция указывает на номер символа (с которого начинается имя функции) с начала строки.
4 года назад
Ivan Gagarinov
Иван, спасибо за такие доходчивые разъяснения!!!
4 года назад
Карен Асатрян
throw Error('func1 error!'); без new?
2 года назад
Александр Казарин
Трассировка стека (stack trace) — список вызовов функций, через которые программа пришла к ошибке. Его показывают вместе с сообщением об исключении:
Как читать
- Первая строка — тип ошибки и сообщение.
- Строки с
at— функции от места ошибки к началу вызова. Сверху — где упало, ниже — кто вызвал. app.js:6:15— файл, строка и позиция в строке.
Ищите первую строку из вашего кода: строки из node_modules и внутренних модулей обычно можно пропустить.
Получить стек из кода
Стек текущего места без ошибки: console.trace('Как мы сюда попали').
throw Error() без new
В комментарии спрашивали, работает ли throw Error('func1 error!') без new. Работает: Error, вызванный как функция, создаёт объект ошибки так же, как с new, и стек в нём будет. Для единообразия обычно пишут new Error().
throw 'текст' выбрасывает строку, у которой стека нет. Выбрасывайте объекты Error.
Асинхронный код
В async-функциях стек показывает цепочку await. В колбэках setTimeout и старых промисах стек обрывается на событийном цикле, и вызывающая функция в нём не видна.
Минифицированный код в браузере
В собранном коде стек указывает на main.3f2a.js:1:45678. Чтобы видеть исходные файлы и строки, включите source maps в сборщике — Vite и webpack делают это для режима разработки сами.
Ошибки и отладку разбирают в бесплатном курсе «Основы JavaScript».
17 дней назад
Никита Вихров



.png)


