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' ); }
Код имеет два варианта исполнения:
Если вы ответите «Да» на «Сделать ошибку?», то попробуйте → поймать → наконец.
Если вы скажете «Нет», то попробуйте → наконец.