Обработка ошибок, "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}67console.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}89try {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}78try {9 throw "Hello!";10} catch(e) {11 console.log(e);12}
Если инструкция throw используется без инструкции try/catch то, сгенерированное исключение выводится в консоль браузера.