У каждого из нас в процессе разработки возникали ошибки (исключительная ситуация). В данном случае программа просто прекращает свою работу и выводит ошибку в консоль, а хотелось бы, что бы сценарий не просто прекратился, а сделал что-нибудь полезное.
Для того, что бы мы могли контролировать поведение программы в процессе возникновения ошибки, JavaScript предлагает конструкцию try / catch / finaly .
Конструкция try...catch
С помощью конструкции try…catch можно перехватить исключение и обработать его.
Синтаксис:
try {
//Ваш код
} catch (err){
//Обработка ошибок
}
В блоке try находятся инструкции, которые выполняются вне зависимости от того, будет ошибка или нет. Блок catch отработает только когда возникнет ошибка, именно в этом блоке мы можем обработать исключение оперируя объектом ошибки, которое содержит переменная err (название может быть любым). Объект ошибки содержит три основных свойства:
- name — тип ошибки
- message — описание причины возникновения
- stack — строчка, где произошла ошибка
Пример работы:
try {
allertt(); // ошибка, т.к. функция не определена
} catch (err){
console.log(err);
//ReferenceError: allertt is not defined at 'номер строки'
}
В этом случае в блоке try содержится ошибка и если бы мы не использовали try…catch, то программа просто прекратит свою роботу.
Но в нашем случае вместо красной надписи в консоле, в блоке catch мы получили объект ошибки с кратким пояснением что произошло и на какой строке.
Важно понимать, что try…catch обрабатывает семантические ошибки и если у вас в каком-нибудь из участков кода будет не закрыта скобка, конструкция try даже не отработает полностью.
Блок finaly
Существует еще один блок, называемый finaly, он не обязателен. Основная его особенность заключается в том, что он вызывается всегда независимо от того, было исключение или нет. Другими словами если у нас в код возвращает ошибку, то отработает сначала try, потом catch и в конце finaly.
try {
allertt(); // ошибка, т.к. функция не определена
} catch (err){
console.log(err); //Отработает исключение
//ReferenceError: allertt is not defined at 'номер строки'
} finally {
console.log('Все равно выведу в консоль');
}
Оператор throw
Оператор throw позволяет нам сгенерировать исключение в любой необходимой ситуации. Эта конструкция позволяет использовать любой удобный тип данных в качестве исключение ( число, строка, объект и т.д. ), что делает более гибким обработку ошибок в JavaScript.
try {
let a = 0;
let b = 1;
if (a < b) throw new Error("Переменная a не может быть меньше b");
} catch(e) {
console.log(e); //Error: Переменная a не может быть меньше b at (строка ошибки)
}
При генерации ошибки через throw выражение задает значение исключения в блоке catch. Если же throw используется без конструкции try...catch , то значение исключения выводится в консоль браузера.