JavaScript: Исключения
Исключение – это сигнал о возникновении исключительной ситуации (иначе говоря ошибки) во время выполнения кода. При возникновении ошибки сценарий прекращает свою работу, а в консоль браузера выводится сообщение об ошибке:
alert(x); // Ошибка. Используется неопределённая переменная
Чтобы, при возникновении исключительной ситуации, сценарий не просто прекратил свою работу, а сделал что-то полезное, можно использовать специальные инструкции try/catch/finally
. Данные инструкции позволяют хоть как-то контролировать ситуацию при возникновении непредвиденных ошибок.
Инструкция try/catch
C помощью инструкции try/catch
исключение можно перехватить и обработать. Синтаксис инструкции try/catch
:
try { // Исполняемый код } catch (e) { // При возникновении ошибки, делаем что-то }
В блоке try
располагают код, в котором может возникнуть ошибка во время выполнения программы, а блок catch
позволяет принять решение, что делать при возникновении ошибки. За ключевым словом catch
следует идентификатор в круглых скобках. Этот идентификатор похож на параметр функции. При возникновении исключительной ситуации в блоке try
, этому параметру в качестве аргумента неявно передаётся объект Error
, содержащий сведения об ошибке. Например, объект Error
имеет свойство name
, содержащее сведения о типе ошибки и свойство message
содержащее описание ошибки. Имя параметра в круглых скобках может быть любым допустимым идентификатором:
try { alert(x); alert(2 + 2); // Не будет выполнено } catch (e) { alert(e.name + ": " + e.message); }
Как видно из примера, при возникновении исключения выполнение кода в блоке try
прекращается и управление передаётся блоку catch
. Если в блоке try
ошибка не возникает, то блок catch
просто игнорируется:
try { alert("Код в блоке try"); // Код без ошибок } catch(e) { alert("Блок catch игнорируется"); } alert("Продолжается выполнение кода после инструкции try/catch...");
Без инструкции try/catch
сообщения об ошибках автоматически выводятся в консоль браузера.
Блок finally
К инструкции try/catch
можно добавить ещё один блок – finally
, который будет выполняться всегда. Это означает, что он выполняется и при возникновении исключения, сразу после блока catch
, и без исключения, сразу после того, как блок try
завершит выполнение:
try { alert("Код в блоке try"); // Код без ошибок } catch(e) { alert("Блок catch игнорируется"); } finally { alert("Код в блоке finally"); } try { alert(x); // Ошибка } catch(e) { alert("Код в блоке catch"); } finally { alert("Код в блоке finally"); }
Если исключение никак не планируется обрабатывать то, при наличии блока finally
блок catch
можно опустить:
try { alert(x); } finally { alert("Код в блоке finally"); }
Блоки try
, catch
и finally
начинаются и заканчиваются фигурными скобками. Это обязательная часть их синтаксиса, и она не может быть опущена, даже если внутри блока содержится только одна инструкция.
Инструкция throw
Инструкция throw
позволяет явно сгенерировать исключение. Она имеет следующий синтаксис:
throw выражение;
Результатом выражения может быть значение любого типа. Например, это может быть число, представляющее код ошибки, или строка, содержащая текст сообщения об ошибке. Обычно, в качестве выражения создают стандартный объект типа Error
. Значение выражения неявно передаётся в качестве аргумента блоку catch
:
try { var x = -1; if (x < 0) throw new Error("x не может быть меньше нуля!"); } catch(e) { alert(e); } try { throw "Hello!"; } catch(e) { alert(e); }
Если инструкция throw
используется без инструкции try/catch
то, сгенерированное исключение выводится в консоль браузера.