Потеря Backtrace в блоке catch в JavaScript
В этой статье мы увидим, что «JavaScript теряет трассировку в блоке catch» . След означает потерю чего-то из-за ваших прошлых событий .
Стек поддерживается JavaScript для отслеживания вызванных функций, которые еще не возвращены . Блок try-catch был введен в JavaScript, так что, если в коде JS возникает ошибка, приложение не должно падать , несмотря на то, что блок catch используется для устранения ошибки, где аргумент блока catch, это ошибка.
Синтаксис:
try { // Do something } catch (err) { // Do something }
Давайте разберемся, постановка задачи, с примером в деталях.
Пример 1: Учтите, что в приведенном ниже коде всего 3 функции, т. е. gfgMain(), gfg1() и gfgAPI().
Выход:
Объяснение: В приведенном выше примере использовались три функции:
Main(): Функция Main() содержит блок try-catch. Внутри блока try функция Main() вызывает функцию ErrorDetector(). Блок catch запустится, если функция ErrorDetector() выдаст ошибку.
ErrorDetector(): функция ErrorDetector() также содержит блок try-catch. Внутри блока try функция ErrorDetector() вызывает функцию API_Call(). Блок catch запустится, если функция API_Call() выдаст ошибку.
API_Call(): функция API_Call() возвращает ошибку с сообщением «Этот API GeeksforGeeks возвращает ошибку».
Теперь при пробном запуске кода вызывается функция Main() , а функция Main() вызывает функцию ErrorDetector() внутри блока try. Теперь функция ErrorDetector() запускает функцию API_Call() , которая выдает ошибку. Из-за этой ошибки будет выполнен блок catch ErrorDetector() , и внутри консоли будет напечатан оператор консоли.
Теперь, в общем, как функция API_Call() выдает ошибку, так и ErrorDetector() , а значит, и Main() тоже должна воспроизводить ошибку. Но это не так, Main() успешно возвращается.
Решение. Вы можете наблюдать проблему, заключающуюся в том, что функция Main() должна возвращать ошибку, но возвращается успешно. Это очень опасная проблема, которая может привести к сокрытию внутренних ошибок и, следовательно, к потере трассировки в блоке catch. Это произошло из-за того, что блок catch внутри ErrorDetector() был выполнен без выдачи какой-либо ошибки, что приводит к неправильному управлению функцией Main() .
Чтобы устранить эту ошибку, просто введите ошибку внутри блока catch внутри функции ErrorDetector() .
Пример 2. Рассмотрим тот же пример, что и выше, просто добавьте «throw err» в блоке catch внутри функции ErrorDetector() . Теперь функция Main() выдаст ошибку и выполнит блок catch .
Выход: