Прехвърляне на изключения в JavaScript
Разгледайте блока catch на задачата с JSON продукт:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Некоректен JSON на продукта');
} else if (error.name == 'ProductCostError') {
alert('Продуктът няма цена или количество');
}
}
Както виждате, хващаме две планирани от нас
изключения и по някакъв начин реагираме на това.
Но какво ще стане, ако възникне непредвидено
от нас изключение от друг тип? В този случай
то също ще попадне в блока catch, но
няма да има никаква реакция на това, тъй
като изключението с друг тип просто няма да попадне
в нито един от нашите if-ове.
Когато казвам, че няма да има никаква реакция, имам предвид, че наистина никаква: дори няма да има извеждане на грешка в конзолата. Нашият код просто мълчаливо няма да работи.
Затова съществува следното правило: вашият
код трябва да хваща само тези изключения, с
които знае как да се справи. Ако изключението
е непознато, то трябва да се прехвърли
нататък с помощта на 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');
}
}
Какво не е наред с този код? Поправете го на по-удачен.