Оператор 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.