JavaScript - Обработка исключений
На этом уроке мы познакомимся с оператором обработки исключений try...catch
, который предназначен для перехвата ошибок в некотором блоке кода и их обработки.
Применение оператора try...catch
Оператор обработки исключений try...catch
обычно применяется в следующих ситуациях:
- Для некоторого участка кода, в котором может возникнуть ошибка;
- Для валидации (проверки) данных перед отправкой на сервер;
- Для использования в сложных случаях при написании кроссбраузерных приложений.
Теперь давайте рассмотрим, что же произойдет в сценарии на JavaScript при возникновении ошибки и для чего нужен оператор try...catch
.
Если в сценарии на языке JavaScript появится ошибка, то дальнейшее выполнение программы будет прекращено. Т.е. инструкции (операторы), которые идут после ошибки выполняться не будут. Но если нам необходимо выполнение программы не прерывать, а переходить к следующей инструкции после той, где может возникнуть ошибка, то эту инструкцию необходимо заключить в оператор "try...catch
".
Синтаксис оператора try...catch
Принцип работы с оператором try...catch
заключается в следующем:
Блок, в котором могут возникнуть ошибки, мы обрамляем фигурными скобками, и перед ним пишем ключевое слово try
(с англ. попробовать). После этого блока пишем ключевое слово catch
(с англ. поймать, ловить) и в круглых скобках указываем переменную, в которой будем хранить информацию об ошибке. Далее фигурными скобками обрамляем блок, предназначенный для обработки ошибок.
Принцип работы оператора try...catch
Оператор обработки исключений работает следующим образом:
Сначала он пытается выполнить все инструкции (операторы), указанные в блоке try
. Если внутри блока try
ошибки не возникает, то блок catch
просто игнорируется, т.е. он не выполняется. В том случае если внутри блока try
возникает ошибка, то оставшиеся операторы в этом блоке будут проигнорированы (т.е. они выполняться не будут) и сразу же начнут выполняться операторы внутри блока catch
. Самое главное то, что инструкции, идущие после оператора try...catch
, продолжат выполняться и работа программы не остановится.
try { document.write("Первая строка"); documant.write("Вторая строка"); document.write("Третья строка"); } catch (e) { alert("Ошибка :" + e.message); }
В результате выполнения кода в 4 строчке произойдет ошибка, т.к. оператор documant
браузером будет не определён. В этом случае 5 строчка браузером выполнена не будет, т.к. начнут выполняться операторы в блоке catch
. В качестве параметра блока catch
определим переменную e
, в которой будет хранить информацию об ошибке. Данную переменную мы будем использовать в операторе alert
для вывода сообщения об ошибке.
Блок finally
У оператора обработки исключений есть ещё один блок, который называется finally
. Данный блок является не обязательным, и его можно использовать только при необходимости. Он не имеет параметров и в отличие от блока catch
выполняется всегда, вне зависимости от того возникла ошибка или нет.
Но так как инструкции, идущие после оператора try...catch
тоже выполняются всегда, то возникает вопрос: "Зачем нужен блок finally?"
На самом деле, инструкции, идущие после try...catch
, выполняются не всегда. Это может произойти только в том случае, если произойдет ошибка в блоке catch
. Когда это произойдёт, программа приостановит своё выполнение и операторы, идущие после конструкции try...catch
выполняться не будут. Единственный блок инструкций (операторов), который будет выполняться – это блок finally
.
try { document.write("Первая строка
"); documant.write("Вторая строка
"); document.write("Третья строка
"); } catch (e) { alrt("Ошибка :" + e.message); } finally { document.write("Завершающие действия"); } alert("Операторы после try...catch");
В результате выполнения кода оператор alert
, идущий после конструкции try...catch
так и не будет выполнен.
Там где могут возникнуть ошибки. Т.к. когда возникает ошибка, остальной код JavaScript не выполняется, а это может привести к неработоспособности страницы.
А на практике обработка исключений используется довольно редко, т.к. ошибки в большинстве случаев могут возникнуть именно при выполнении асинхронных операций. А блок try/catch не работает с асинхронными операциями.
Конструкция try/catch может только работать с синхронными операциями. А поскольку синхронные операции не должны выдавать ошибки, то в этом случае применение этой конструкции в большей степени сводится к кроссплатформенной разработке. Т.е. допустим, Вы написали некоторый функционал, и Вы точно не знаете, будет ли он работать во всех браузерах или нет. Это может произойти что один браузер поддерживает какой-то метод, а другой нет. В этом случае этот код необходимо обернуть в try/catch.