Undantagskastning i JavaScript
Låt oss betrakta catch-blocket i uppgiften med JSON-produkt:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Ogiltig JSON för produkten');
} else if (error.name == 'ProductCostError') {
alert('Produkten saknar pris eller kvantitet');
}
}
Som du ser, fångar vi två undantag som vi
har planerat för och reagerar på något sätt.
Men vad händer om ett oförutsett undantag
av en annan typ uppstår? I det fallet kommer
det också att hamna i catch-blocket, men
ingen reaktion kommer att följa, eftersom
undantaget med en annan typ helt enkelt inte kommer att träffa
någon av våra if-satser.
När jag säger att det inte kommer att bli någon reaktion, menar jag att det verkligen inte blir någon: inte ens ett fel som skrivs ut till konsolen. Vår kod kommer helt enkelt att fortsätta utan att fungera.
Därför finns följande regel: din
kod ska endast fånga de undantag som den
vet hur den ska hantera. Om undantaget
är okänt, måste det kastas vidare
med hjälp av throw. I det fallet
kommer någon med bättre koll att fånga det högre upp,
eller så kommer undantaget att skrivas ut som ett fel i konsolen.
Låt oss rätta till vår kod:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Ogiltig JSON för produkten');
} else if (error.name == 'ProductCostError') {
alert('Produkten saknar pris eller kvantitet');
} else {
throw error; // kastar undantaget vidare
}
}
Följande kod ges:
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('slut på utrymme i lagringen');
}
if (error.name == 'SyntaxError') {
alert('ogiltig JSON');
}
}
Vad är fel med den här koden? Råtta den till en bättre version.