Preposielanie výnimiek v JavaScripte
Pozrime sa 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 alebo množstvo');
}
}
Ako vidíte, chytáme dve plánované
výnimky a nejako na ne reagujeme.
Ale čo sa stane, ak nastane neplánovaná
výnimka iného typu? V tomto prípade
tiež padne do bloku catch, ale
žiadna reakcia na ňu nenastane, pretože
výnimka s iným typom jednoducho nespadne
do žiadneho z našich podmienených blokov.
Keď hovorím, že nebude žiadna reakcia, myslím tým, že skutočne žiadna: dokonca nebude žiadny výpis chyby do konzoly. Náš kód bude jednoducho mlčať a nefungovať.
Preto existuje nasledujúce pravidlo: váš
kód by mal chytiť len tie výnimky, s
ktorými vie, ako si poradiť. Ak je výnimka
neznáma, treba ju preposlať
ďalej pomocou throw. V tomto prípade
ju vyššie chytí niekto lepšie informovaný
alebo výnimka vypíše chybu do konzoly.
Opravme náš kód:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nekorektný JSON produktu');
} else if (error.name == 'ProductCostError') {
alert('Produkt nemá cenu alebo množstvo');
} else {
throw error; // preposielame výnimku ďalej
}
}
Daný je nasledujúci 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 miesto v úložisku');
}
if (error.name == 'SyntaxError') {
alert('nekorektný JSON');
}
}
Čo je zlé na tomto kóde? Opravte ho na vhodnejší.