При наличии обработчика исключения исполнение сценария в случае ошибки не останавливается.
Обработчик исключения записывается в следующем формате:
try {
<блок try>
}
catch(<переменная для хранения исключения>) {
<блок catch>
}
[finally {
<блок finally>
}]
Если в блоке try возникнет исключение, будет выполнен блок catch — обработчик исключений, а потом — блок finally (если он указан). Если в блоке try исключения не возникнет, выполнится только блок finally (опять же, если он указан).
В блоке finally записывается код, который должен выполниться независимо от того, возникла ли ошибка или нет.
Переменной, указанной в скобках после слова catch, будет присвоен объект исключения. Эта переменная будет доступна только в блоке catch и может быть использована для получения сведений об ошибке.
Все классы исключений поддерживают два свойства:
name — хранит имя класса исключения в виде строки. Вот все поддерживаемые классы исключений:
SyntaxError — в строке с выражением, переданной встроенной функции eval (см. разд. 3.9), присутствует ошибка:
eval('1 + 1#');
// Здесь возникает исключение SyntaxError,
// поскольку оператор # в отсутствует
ReferenceError — обращение к несуществующей переменной, функции, объекту, методу или классу. Возникает только в веб-сценариях.
TypeError — неподходящий тип значения:
let n = 1;
n.toUpperCase();
// Здесь возникает исключение TypeError,
// поскольку метод toUpperCase не поддерживается числами
RangeError — для параметра функции или метода указано недопустимое значение:
let n = 1;
let s = n.toPrecision(500);
// Здесь возникает исключение RangeError,
// поскольку в качестве параметра метода toPrecision задано
// слишком большое значение
URIError — ошибка декодирования GET- или POST-параметра (о GET-, POST-параметрах и передаче данных разговор пойдет на уроке 19);
EvalError — то же, что и SyntaxError. Поддерживалось более старыми версиями и может встретиться в старом коде;
message — описание возникшей ошибки в виде строки.
Вот пример кода, обрабатывающий ситуацию, когда функция someFunc, используемая в вычислениях, не объявлена:
let n;
window.document.write('<p>');
try {
n = someFunc(123);
window.document.write(n);
}
catch(exception) {
if (exception.name == 'ReferenceError') {
window.document.write('Функция someFunc не объявлена. ',
'Привяжите к странице файл somefunc.js с ее ',
'объявлением.');
}
else {
window.document.write('Возникла ошибка ', exception.name,
': ', exception.message);
}
}
finally {
window.document.write('</p>');
}
Теперь, если мы забудем привязать к странице файл с объявлением функции someFunc, на экране появится предупреждающее сообщение, и сценарий не будет остановлен, а продолжит работать.
5.4.1. Генерирование исключений
Мы можем сгенерировать исключение искусственно, чтобы сообщить другому фрагменту сценария о возникшей нештатной ситуации.
Оператор генерирования исключения throw принимает в качестве параметра объект исключения. Формат этого оператора:
throw <объект исключения>
Для создания объекта исключения следует использовать оператор new (см. разд. 4.6). Объект создается на основе наиболее подходящего класса из упомянутых ранее.
Сгенерированное исключение может быть обработано посредством обычного обработчика.
Вот вариант функции circleLength, проверяющей, является ли переданный ей параметр числом, и, если это не так, генерирующей исключение класса TypeError:
function circleLength(d) {
let l;
if (typeof d != 'number') {
const ex = new TypeError();
ex.message = 'Допустимы только числа';
throw ex;
}
l = d * Math.PI;
return l;
}
Генерируемое этой функцией исключение мы можем обработать следующим образом:
window.document.write('<tr><td>yte</td>');
window.document.write('<td>');
try {
// Пытаемся вызвать функцию circleLength, передав ей строку 'yte',
// и вывести возвращённый ей результат на экран
window.document.write(circleLength('yte'));
}
catch(ex) {
// Если функция сгенерировала исключение, выводим сообщение об ошибке
window.document.write(ex.message);
}
finally {
// В любом случае выводим закрывающие теги
window.document.write('</td></tr>');
}
Генерирование исключений часто применяется при проверке, правильные ли параметры были переданы функции, присутствует ли на странице нужный элемент и т. п.