Viderekasting av unntak i JavaScript
La oss se på catch-blokken i JSON-produktoppgaven:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Ugyldig JSON for produkt');
} else if (error.name == 'ProductCostError') {
alert('Produktet mangler pris eller antall');
}
}
Som du ser, fanger vi to unntak som vi har planlagt
og reagerer på en måte på dem.
Men hva skjer hvis det oppstår et uforutsett
unntak av en annen type? I dette tilfellet
vil det også havne i catch-blokken, men
det vil ikke være noen reaksjon på dette,
siden unntaket med en annen type rett og slett ikke vil treffe
noen av våre if-setninger.
Når jeg sier at det ikke vil være noen reaksjon, mener jeg at det virkelig ikke blir noen: selv ikke noen feilmelding i konsollen. Koden vår vil rett og slett ikke fungere i stillhet.
Derfor finnes følgende regel: koden din
skal bare fange de unntakene som den
vet hvordan den skal håndtere. Hvis unntaket
er ukjent, må det videresendes
videre ved hjelp av throw. I dette tilfellet
vil det bli fanget høyere opp av noen som er mer kjent med situasjonen,
eller unntaket vil vises som en feil i konsollen.
La oss rette opp koden vår:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Ugyldig JSON for produkt');
} else if (error.name == 'ProductCostError') {
alert('Produktet mangler pris eller antall');
} else {
throw error; // sender unntaket videre
}
}
Følgende kode er gitt:
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('plass i lagringen er oppbrukt');
}
if (error.name == 'SyntaxError') {
alert('ugyldig JSON');
}
}
Hva er galt med denne koden? Gjør den om til en bedre versjon.