Проброс исключений в JavaScript

Рассмотрим блок 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'); } }

Что не так с этим кодом? Исправьте его на более удачный.

enru