Poikkeusten heittäminen eteenpäin JavaScriptissä
Tarkastellaan JSON-tuotteen tehtävän catch-lohkoa:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Virheellinen JSON-tuote');
} else if (error.name == 'ProductCostError') {
alert('Tuotteella ei ole hintaa tai määrää');
}
}
Kuten näet, saalisimme kaksi suunnittelemaamme
poikkeusta ja reagoimme jollakin tavalla niihin.
Mutta mitä tapahtuu, jos ilmaantuu meille
ennakkoon suunnittelematon toisen tyyppinen
poikkeus? Tässä tapauksessa se myös päätyy
catch-lohkoon, mutta
minkäänlaista reaktiota ei seuraa, koska
toisen tyyppinen poikkeus ei yksinkertaisesti päädy
mihinkään if-lauseistamme.
Kun sanon, ettei mitään reaktiota tule, tarkoitan, että todella mitään: edes virheen putoamista konsoliin ei tapahdu. Koodimme ei toimi vain hiljaa.
Siksi on olemassa seuraava sääntö: koodisi
pitäisi saalistaa vain ne poikkeukset, joiden
kanssa se tietää, kuinka selviytyä. Jos poikkeus
on tuntematon, se on heitettävä
eteenpäin käyttämällä throw. Tässä
tapauksessa sen yläpuolella saalii joku paremmin tietoinen
tai poikkeus putoaa virheenä konsoliin.
Korjataan koodimme:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Virheellinen JSON-tuote');
} else if (error.name == 'ProductCostError') {
alert('Tuotteella ei ole hintaa tai määrää');
} else {
throw error; // heitetään poikkeus eteenpäin
}
}
Annettuna on seuraava koodi:
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('tila loppui tallennustilasta');
}
if (error.name == 'SyntaxError') {
alert('virheellinen JSON');
}
}
Mikä tässä koodissa on vialla? Korjaa se onnistuneemmaksi.