Ausnahmeweitergabe in JavaScript
Betrachten wir den catch-Block der Aufgabe mit dem JSON-Produkt:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Ungültiges JSON-Produkt');
} else if (error.name == 'ProductCostError') {
alert('Dem Produkt fehlt der Preis oder die Menge');
}
}
Wie Sie sehen, fangen wir zwei von uns geplante
Ausnahmen ab und reagieren irgendwie darauf.
Aber was passiert, wenn eine nicht von uns vorgesehene
Ausnahme eines anderen Typs auftritt? In diesem Fall
wird sie ebenfalls in den catch-Block gelangen, aber
es wird keine Reaktion darauf erfolgen, da
die Ausnahme mit einem anderen Typ einfach in
keine unserer if-Bedingungen passt.
Wenn ich sage, dass es keine Reaktion geben wird, meine ich, dass es wirklich keine gibt: nicht einmal eine Fehlerausgabe in der Konsole. Unser Code wird einfach stillschweigend nicht funktionieren.
Daher gibt es die folgende Regel: Ihr
Code sollte nur die Ausnahmen abfangen, mit
denen er umzugehen weiß. Wenn die Ausnahme
unbekannt ist, muss sie mit throw
weiter geworfen werden. In diesem Fall
wird sie weiter oben von jemandem abgefangen, der besser informiert ist,
oder die Ausnahme wird als Fehler in der Konsole ausgegeben.
Korrigieren wir unseren Code:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Ungültiges JSON-Produkt');
} else if (error.name == 'ProductCostError') {
alert('Dem Produkt fehlt der Preis oder die Menge');
} else {
throw error; // Ausnahme weiter werfen
}
}
Gegeben ist der folgende Code:
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('Speicherplatz im Storage ist aufgebraucht');
}
if (error.name == 'SyntaxError') {
alert('Ungültiges JSON');
}
}
Was ist an diesem Code falsch? Korrigieren Sie ihn auf eine bessere Version.