А что, если в блоке try {...}
возникнет другая неожиданная ошибка?
Например, программная (неопределённая переменная) или какая-то ещё, а не ошибка, связанная с некорректными данными.
Пример:
let json = '{ "age": 30 }'; // данные неполны
try {
user = JSON.parse(json); // <-- забыл добавить "let" перед user // ...
} catch(err) {
alert("JSON Error: " + err); // JSON Error: ReferenceError: user is not defined // (не JSON ошибка на самом деле) }`
Блок catch
должен обрабатывать только те ошибки, которые ему известны, и «пробрасывать» все остальные.
Техника «проброс исключения» выглядит так:
- Блок
catch
получает все ошибки. - В блоке
catch(err) {...}
мы анализируем объект ошибкиerr
. - Если мы не знаем как её обработать, тогда делаем
throw err
.
В коде ниже мы используем проброс исключения, catch
обрабатывает только SyntaxError
:
let json = '{ "age": 30 }'; // данные неполны
try {
let user = JSON.parse(json);
if (!user.name) {
throw new SyntaxError("Данные неполны: нет имени"); } _
blabla(); // неожиданная ошибка_
alert( user.name );
} catch(e) { _
if (e.name == "SyntaxError") {
alert( "JSON Error: " + e.message );
} else {
throw e; // проброс (*) }_ }`
Ошибка в строке (*)
из блока catch
«выпадает наружу» и может быть поймана другой внешней конструкцией try..catch
(если есть), или «убьёт» скрипт.
Таким образом, блок catch
фактически обрабатывает только те ошибки, с которыми он знает, как справляться, и пропускает остальные.