try — проверить блок кода на наличие ошибок.

catch — обработать ошибку.

throw — создавать собственные ошибки.

наконец — выполнить код после попытки и перехвата, независимо от результата.

Синтаксис «попробуй… поймай»

Конструкция try…catch состоит из двух основных блоков:

try {
// code
} catch (err) {
// handling error
}

Блок-схема «попробуй… поймай»

Давайте рассмотрим пример

Пример без ошибки:

try {
alert('Start'); 
// ...no errors 
alert('End');  
} catch (err) {
alert('Catch is ignored, because there are no errors');
}

В этом коде ошибки нет, поэтому catch игнорируется.

С примером ошибки:

try {
alert('Start of try runs');  
blablabla; // error, variable is not defined!
alert('End(no reached)'); 
} catch (err) {
alert(`Error has occurred!`);
}

try...catch работает только с ошибками времени выполнения

Чтобы try…catch работал, код должен быть работоспособным. Другими словами, это должен быть допустимый JavaScript.

try {
  <<<<<<<<<
} catch (err) {
  alert("Can't understand this code, it's invalid");
}

Итак, try…catch может обрабатывать только те ошибки, которые возникают в корректном коде. Такие ошибки называются «ошибками времени выполнения» или, иногда, «исключениями».

try…catch работает синхронно

Если в «запланированном» коде произойдет исключение, то try…catch его не поймает:

try {
  setTimeout(function() {
    noSuchVariable; // script will stop/die here
  }, 1000);
} catch (err) {
  alert( "won't work" );
}

Чтобы перехватить исключение внутри запланированной функции, try…catch должен находиться внутри этой функции:

setTimeout(function() {
  try {
    noSuchVariable; // try...catch handles the error!
  } catch {
    alert( "error is caught here!" );
  }
}, 1000);

Объект ошибки

В JavaScript есть встроенный объект ошибки, который предоставляет информацию об ошибке при возникновении ошибки.

Объект ошибки предоставляет два полезных свойства: имя и сообщение.

name - устанавливает или возвращает имя ошибки

message - Устанавливает или возвращает сообщение об ошибке (строка)

попробовать… поймать… наконец

Конструкция try…catch может иметь еще одно предложение кода: finally.

Расширенный синтаксис выглядит так:

try {
   ... try to execute
} catch (err) {
   ... handle errors
} finally {
   ... execute always
}

Попробуйте запустить этот код:

try {
  alert( 'try' );
  if (confirm('Make an error?')) BAD_CODE();
} catch (err) {
  alert( 'catch' );
} finally {
  alert( 'finally' );
}

Код имеет два варианта исполнения:

Если вы ответите «Да» на «Сделать ошибку?», то попробуйте → поймать → наконец.
Если вы скажете «Нет», то попробуйте → наконец.