Оператор try позволяет проверить блок кода на возникновение ошибок.
Оператор catch позволяет обрабатывать возникшую ошибку.
Оператор throw позволяет генерировать пользовательские ошибки.
Оператор finally позволяет выполнять код после операторов try и catch не зависимо от результата.
Ошибки будут!
Во время выполнения кода JavaScript, могут возникать разные ошибки.
Это могут быть ошибки кодирования, сделанные программистом, ошибки, возникающие в результате ввода неверных данных, и другие непредвиденные вещи.
В следующем примере, чтобы умышленно создать ошибку, мы вместо команды alert написали adddlert:
<p id="demo"></p>
<script>
try {
adddlert("Добро пожаловать, гость!");
}
catch(err) {
document.getElementById("demo").innerHTML = err.message;
}
</script>
JavaScript перехватит adddlert как ошибку и выполнит код в операторе catch, чтобы ее обработать.
Операторы try и catch
Оператор try определяет блок кода, который во время выполнения будет проверяться на возникновение ошибок.
Оператор catch определяет блок кода, который будет выполняться, если в блоке оператора try возникнет ошибка.
Операторы try и catch всегда используются в паре:
try {
// проверяемый блок кода
}
catch(err) {
// блок кода для обработки ошибок
}
JavaScript генерирует ошибки
Когда возникает ошибка, обычно интерпретатор JavaScript останавливает выполнение кода и генерирует сообщение об ошибке.
Если говорить техническими терминами, то интерпретатор JavaScript сгенерирует исключение (сгенерирует ошибку).
На самом деле интерпретатор JavaScript создаст объект Error с двумя свойствами — name и message.
Оператор throw
Оператор throw позволяет создавать пользовательские ошибки.
В техническом смысле вы можете генерировать исключения (генерировать ошибки).
Исключения могут быть строкой, числом, логическим значением или объектом JavaScript:
throw "Слишком большой";
throw 500;
Используя оператор throw вместе с try и catch, вы можете контролировать ход программы и генерировать пользовательские сообщения об ошибках.
Пример проверки ввода
В следующем примере проверяются данные ввода. Если введено неверное значение, то генерируется исключение (err).
Исключение (err) перехватывается оператором catch, и выводится пользовательское сообщение об ошибке:
<!DOCTYPE html>
<html>
<body>
<p>Введите число от 5 до 10:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">Проверка ввода</button>
<p id="p01"></p>
<script>
function myFunction() {
var message, x;
message = document.getElementById("p01");
message.innerHTML = "";
x = document.getElementById("demo").value;
try {
if(x == "") throw "пусто";
if(isNaN(x)) throw "не число";
x = Number(x);
if(x < 5) throw "слишком мало";
if(x > 10) throw "слишком много";
}
catch(err) {
message.innerHTML = "Вы ввели " + err;
}
}
</script>
</body>
</html>
HTML проверка
Приведенный выше код это всего лишь пример.
Современные браузеры часто используют комбинацию JavaScript и встроенной HTML проверки, реализуемой при помощи предопределенных правил, заданных в HTML атрибутах:
<input id="demo" type="number" min="5" max="10" step="1" >
Оператор finally
Оператор finally позволяет выполнить код после операторов try и catch, независимо от результатов проверки:
try {
// проверяемый блок кода
}
catch(err) {
// блок кода для обработки ошибок
}
finally {
// блок кода, выполняемый не зависимо от результата операторов try / catch
}
Пример:
function myFunction() {
var message, x;
message = document.getElementById("p01");
message.innerHTML = "";
x = document.getElementById("demo").value;
try {
if(x == "") throw "пусто";
if(isNaN(x)) throw "не число";
x = Number(x);
if(x < 5) throw "слишком мало";
if(x > 10) throw "слишком много";
}
catch(err) {
message.innerHTML = "Ошибка: " + err + ".";
}
finally {
document.getElementById("demo").value = "";
}
}
Объект Error
В JavaScript есть встроенный объект Error, который предоставляет информацию по возникшей ошибке.
Объект Error предоставляет два полезных свойства:
Свойство | Описание |
---|---|
name | Устанавливает или возвращает имя ошибки |
message | Устанавливает или возвращает сообщение об ошибке (строку) |
Значения свойства name
В свойстве name объекта Error может быть возвращено шесть различных значений:
Имя ошибки | Описание |
---|---|
EvalError | Ошибка в функции eval() |
RangeError | Число "за пределами диапазона" |
ReferenceError | Недопустимая ссылка (обращение) |
SyntaxError | Синтаксическая ошибка |
TypeError | Ошибка типов |
URIError | Ошибка в encodeURI() |
EvalError
EvalError указывает на то, что возникла ошибка в функции eval().
В более новых версиях JavaScript никогда не генерируется ошибка EvalError. Вместо нее используется SyntaxError.
RangeError
Ошибка RangeError возникает, если вы используете число, которое выходит за пределы диапазона допустимых значений.
Например, нельзя задать число с 500 знаковыми цифрами.
var num = 1;
try {
num.toPrecision(500); // Число не может иметь 500 знаковых цифр
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
ReferenceError
Ошибка ReferenceError возникает в том случае, когда вы используете (ссылаетесь) переменную, которая не была декларирована:
var x;
try {
x = y + 1; // нельзя использовать (ссылаться на) переменную y
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
SyntaxError
Ошибка SyntaxError возникает, когда вы пытаетесь выполнить код с синтаксическими ошибками.
try {
eval("alert('Hello)"); // Пропуск ' приведет к синтаксической ошибке
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
TypeError
Ошибка TypeError возникает, когда вы используете значение, выходящее за пределы диапазона ожидаемых типов:
var num = 1;
try {
num.toUpperCase(); // Нельзя преобразовать число в верхний регистр
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
URIError
Ошибка URIError возникает, когда вы используете недопустимые символы в функциях URI:
try {
decodeURI("%%%"); // Нельзя декодировать эти символы процентов
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
Нестандартные свойства объекта Error
Mozilla и Microsoft определяют ряд нестандартных свойств объекта Error:
fileName (Mozilla)
lineNumber (Mozilla)
columnNumber (Mozilla)
stack (Mozilla)
description (Microsoft)
number (Microsoft)
Никогда не используйте эти свойства в публичном веб-сайте. Они не будут работать во всех браузерах.