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