Оператор try...catch...finally в JS

В этой статье вы познакомитесь с обработкой исключений в JS с помощью оператора try...catch...finally.

Блоки try, catch и finally позволяют обрабатывать исключения — виды ошибок в программе. Так что прежде, чем перейти к изучению конструкции try...catch...finally сначала выясним, какие ошибки вообще бывают.

Виды ошибок

В коде может возникнуть два типа ошибок, которые можно «отловить»: 

• Syntax Error (синтаксическая ошибка). Например, если вы напишите consol.log('пример'); — программа будет ругаться на синтаксическую ошибку: слово console написано неправильно.

• Runtime Error (ошибка при выполнении программы). Например, такая ошибка возникнет, если в коде вызвать несуществующую функцию или переменную.

Все эти ошибки называются исключениями. Теперь давайте узнаем, как их обрабатывать, — для этого вернемся к конструкции try...catch...finally.

Оператор try...catch

Оператор try...catch позволяет обрабатывать исключения. 

Синтаксис

try {
    // блок try
// содержит потенциальную ошибку } catch(error) { // блок catch
// выполняется в случае ошибки

Основной код с потенциальной ошибок — в блоке try.

  • Если в блоке try возниканет ошибка, управление перейдет в блок catch. В этом блоке происходит обработка исключений: что надо сделать, если ошибка появилась.
  • Если в блоке try ошибок нет, код продолжит выполняться, а код из блока catch будет пропущен.

Пример 1. Выводим необъявленную переменную

const numerator= 100, denominator = 'a';

try {
     console.log(numerator/denominator);

    // забыли объявить переменную a      
    console.log(a);
}
catch(error) {
    console.log('Возникла ошибка'); 
    console.log('Сообщение об ошибке: ' + error);  
}

Вывод

NaN
Возникла ошибка
Сообщение об ошибке: ReferenceError: a is not defined

В этом примере мы забыли объявить переменную a. Поэтому когда мы попытались вывести ее на экран, программа «выкинула» ошибку. Блок catch «отловит» это исключение — выполнился соответсвующий код. 

Оператор try...catch...finally

Обрабатывать исключения можно и с помощью оператора try...catch...finally. Блок finally выполняется в любом случае, независимо от того, возникают ошибка или нет. 

Синтаксис

try {
    // блок try
// содержит потенциальную ошибку } catch(error) { // блок catch
// выполняется в случае ошибки } finally() { // блок finally
// выполняется в любом случае }

Пример 2. Используем блок finally

const numerator= 100, denominator = 'a';

try {
     console.log(numerator/denominator);
     console.log(a);
}
catch(error) {
    console.log('Возникла ошибка'); 
    console.log('Сообщение об ошибке: ' + error);  
}
finally {
     console.log('Этот текст выведется в любом случае =)');
}

Вывод

NaN
Возникла ошибка
Сообщение об ошибке: ReferenceError: a is not defined
Этот текст выведется в любом случае =)

В этом примере возникает все та же ошибка: переменная a не объявлена. Из-за этого управление переходит в блок catch и выполняется код из него. Код в блоке finally выполняются в любом случае — даже если ошибки не возникло бы.

Примечание. Блок catch и finally обязательно должны идти после блока try. В противном случае возникнет ошибка Uncaught SyntaxError: Missing catch or finally after try.

try...catch в связке с setTimeout()

Оператор try...catch не сработает, если ошибка возникает в «отложенном» коде — например, внутри setTimeout().

try {
    setTimeout(function() {
        // допустим, здесь возникла ошибка
    }, 3000);
} catch (e) {
  console.log( "не сработает =(" );
}

Обработка ошибки в этой программе не получится. Дело в том, что код в блоке try выполнится через 3000 секунд — уже после того, как программа покинет конструкцию try...catch.

Чтобы обрабывать ошибки в setTimeout(), нужно поместить try...catch внутрь setTimeout(). Например, это может выглядеть вот так:

setTimeout(function() {
    try {
        // здесь возникает ошибка
    } catch {
        console.log( "Возникла ошибка" );
    }
}, 3000);

Чтобы создавать свои исключения, можно использовать оператор throw. Представьте, что какое-то число делится на 0. Результатом такой операции в JavaScript будет Infinity. Но если вы хотите, чтобы программа выдавала ошибку при попытке разделить на 0, можно создать свое исключение, которое будет вызываться с помощью оператора throw.   

codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©