Потеря Backtrace в блоке catch в JavaScript

Опубликовано: 20 Февраля, 2023

В этой статье мы увидим, что «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 .

Выход: