Propagace výjimek v JavaScriptu
Podívejme se na blok catch úlohy s JSON produktu:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nekorektní JSON produktu');
} else if (error.name == 'ProductCostError') {
alert('Produkt nemá cenu nebo množství');
}
}
Jak vidíte, zachycujeme dvě plánované
výjimky a nějak na ně reagujeme.
Ale co se stane, když nastane nepředpokládaná
výjimka jiného typu? V tomto případě
se také dostane do bloku catch, ale
nedojde k žádné reakci, protože
výjimka s jiným typem jednoduše nespadne
do žádného z našich ifů.
Když říkám, že nedojde k žádné reakci, myslím tím, že skutečně k žádné: ani se neobjeví chyba v konzoli. Náš kód bude jednoduše mlčky nefungovat.
Proto existuje následující pravidlo: váš
kód by měl zachytávat pouze ty výjimky, se
kterými ví, jak si poradit. Pokud je výjimka
neznámá, je ji třeba propagovat
dále pomocí throw. V tomto případě
ji výše zachytí někdo lépe informovaný
nebo se výjimka objeví jako chyba v konzoli.
Pojďme opravit náš kód:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nekorektní JSON produktu');
} else if (error.name == 'ProductCostError') {
alert('Produkt nemá cenu nebo množství');
} else {
throw error; // propagujeme výjimku dál
}
}
Je dán následující kód:
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('došlo místo v úložišti');
}
if (error.name == 'SyntaxError') {
alert('nekorektní JSON');
}
}
Co je špatně na tomto kódu? Opravte jej na vhodnější.