Kivételek továbbdobása JavaScriptben
Vizsgáljuk meg a JSON termék feladat catch blokkját:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Hibás JSON termék');
} else if (error.name == 'ProductCostError') {
alert('A terméknek nincs ára vagy mennyisége');
}
}
Amint látható, elkapunk két általunk tervezett
kivételt és valahogy reagálunk rájuk.
De mi történik, ha egy általunk nem előzhető,
más típusú kivétel merül fel? Ebben az esetben
az is belép a catch blokkba, de
erre nem következik be semmilyen reakció,
mivel a más típusú kivétel egyszerűen nem kerül
be egyik if águnkba sem.
Amikor azt mondom, hogy nem lesz semmilyen reakció, akkor azt értem, hogy tényleg semmi: még hiba sem jelenik meg a konzolon. A kódunk egyszerűen csendesen nem fog működni.
Ezért létezik a következő szabály: a kódodnak
csak azokat a kivételeket kapja el, amelyekkel
tudja, hogyan bánjon. Ha a kivétel ismeretlen,
akkor azt tovább kell dobni
a throw segítségével. Ebben az esetben
feljebb valaki jobban informált elkapja,
vagy a kivétel hibaként megjelenik a konzolon.
Javítsuk a kódunkat:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Hibás JSON termék');
} else if (error.name == 'ProductCostError') {
alert('A terméknek nincs ára vagy mennyisége');
} else {
throw error; // továbbdobjuk a kivételt
}
}
Adott a következő 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('elfogyott a hely a tárolóban');
}
if (error.name == 'SyntaxError') {
alert('hibás JSON');
}
}
Mi a baj ezzel a kóddal? Javítsa ki egy megfelelőbb verzióra.