Рассмотрим блок catch
задачи с JSON продукта:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Некорректный JSON продукта');
} else if (error.name == 'ProductCostError') {
alert('У продукта отсутствует цена или количество');
}
}
Как вы видите, мы ловим два запланированных
нами исключения и как-то реагируем на это.
Но что будет, если возникнет непредусмотренное
нами исключение другого типа? В этом случае
оно тоже попадет в блок catch
, но
никакой реакции на это не последует, так
как исключение с другим типом просто не попадет
ни в один из наших ифов.
Когда я говорю, что не будет никакой реакции, то имею ввиду, что реально никакой: даже не будет вываливания ошибки в консоль. Наш код просто молча не будет работать.
Поэтому существует следующее правило: ваш
код должен ловить только те исключения, с
которыми знает, как справится. Если исключение
не известное, то его нужно пробросить
дальше с помощью throw
. В этом случае
выше его поймает кто-то более осведомленный
либо исключение вывалится ошибкой в консоль.
Давайте поправим наш код:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Некорректный JSON продукта');
} else if (error.name == 'ProductCostError') {
alert('У продукта отсутствует цена или количество');
} else {
throw error; // пробрасываем исключение далее
}
}
Дан следующий код:
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('закончилось место в хранилище');
}
if (error.name == 'SyntaxError') {
alert('некорректный JSON');
}
}
Что не так с этим кодом? Исправьте его на более удачный.