HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

Обработка ошибок, "try..catch"

Исключение – это сигнал о возникновении исключительной ситуации (иначе говоря ошибки) во время выполнения кода. При возникновении ошибки сценарий прекращает свою работу, а в консоль браузера выводится сообщение об ошибке:

1console.log(x); // Ошибка. Используется неопределённая переменная

Чтобы, при возникновении исключительной ситуации, сценарий не просто прекратил свою работу, а сделал что-то полезное, можно использовать специальные инструкции try/catch/finally. Данные инструкции позволяют хоть как-то контролировать ситуацию при возникновении непредвиденных ошибок.

Инструкция try/catch

C помощью инструкции try/catch исключение можно перехватить и обработать. Синтаксис инструкции try/catch:

1try {
2 // Исполняемый код
3}
4catch (e) {
5 // При возникновении ошибки, делаем что-то
6}

В блоке try располагают код, в котором может возникнуть ошибка во время выполнения программы, а блок catch позволяет принять решение, что делать при возникновении ошибки. За ключевым словом catch следует идентификатор в круглых скобках. Этот идентификатор похож на параметр функции. При возникновении исключительной ситуации в блоке try, этому параметру в качестве аргумента неявно передаётся объект Error, содержащий сведения об ошибке. Например, объект Error имеет свойство name, содержащее сведения о типе ошибки и свойство message содержащее описание ошибки. Имя параметра в круглых скобках может быть любым допустимым идентификатором:

1try {
2 console.log(x); // Ошибка. Используется неопределённая переменная
3 console.log(1+2); // Не будет выполнено
4} catch (e) {
5 console.error(e.name + ": " + e.message);
6}

При возникновении исключения выполнение кода в блоке try прекращается и управление передаётся блоку catch. Если в блоке try ошибка не возникает, то блок catch просто игнорируется:

1try {
2 console.log("Код в блоке try"); // Код без ошибок
3} catch(e) {
4 console.error("Блок catch игнорируется");
5}
6
7console.log("Продолжается выполнение кода после инструкции try/catch...");

Без инструкции try/catch сообщения об ошибках автоматически выводятся в консоль браузера.

Блок finally

К инструкции try/catch можно добавить ещё один блок – finally, который будет выполняться всегда. Это означает, что он выполняется и при возникновении исключения, сразу после блока catch, и без исключения, сразу после того, как блок try завершит выполнение:

1try {
2 console.log("Код в блоке try"); // Код без ошибок
3} catch(e) {
4 console.error("Блок catch игнорируется");
5} finally {
6 console.log("Код в блоке finally");
7}
8
9try {
10 console.log(x); // Ошибка
11} catch(e) {
12 console.log("Код в блоке catch");
13} finally {
14 console.log("Код в блоке finally");
15}

Если исключение никак не планируется обрабатывать то, при наличии блока finally блок catch можно опустить:

1try {
2 console.log(x);
3} finally {
4 console.log("Код в блоке finally");
5}

Блоки try, catch и finally начинаются и заканчиваются фигурными скобками. Это обязательная часть их синтаксиса, и она не может быть опущена, даже если внутри блока содержится только одна инструкция.

Инструкция throw

Инструкция throw позволяет явно сгенерировать исключение. Она имеет следующий синтаксис:

1throw statement

Результатом выражения может быть значение любого типа. Например, это может быть число, представляющее код ошибки, или строка, содержащая текст сообщения об ошибке. Обычно, в качестве выражения создают стандартный объект типа Error. Значение выражения неявно передаётся в качестве аргумента блоку catch:

1try {
2 var x = -1;
3 if (x < 0) throw new Error("x не может быть меньше нуля!");
4} catch(e) {
5 console.log(e);
6}
7
8try {
9 throw "Hello!";
10} catch(e) {
11 console.log(e);
12}

Если инструкция throw используется без инструкции try/catch то, сгенерированное исключение выводится в консоль браузера.

Hello