Прослеђивање изузетака у 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');
}
}
Шта није у реду са овим кодом? Исправите га на успешнији.