Обработка исключений в JavaScript

У каждого из нас в процессе разработки возникали ошибки (исключительная ситуация). В данном случае программа просто прекращает свою работу и выводит ошибку в консоль, а хотелось бы, что бы сценарий не просто прекратился, а сделал что-нибудь полезное.

Для того, что бы мы могли контролировать поведение программы в процессе возникновения ошибки, 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 , то значение исключения выводится в консоль браузера.