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 то, сгенерированное исключение выводится в консоль браузера.