А что, если в блоке 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 должен обрабатывать только те ошибки, которые ему известны, и «пробрасывать» все остальные.

Техника «проброс исключения» выглядит так:

  1. Блок catch получает все ошибки.
  2. В блоке catch(err) {...} мы анализируем объект ошибки err.
  3. Если мы не знаем как её обработать, тогда делаем 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 фактически обрабатывает только те ошибки, с которыми он знает, как справляться, и пропускает остальные.


Назад