Klaidų perleidimas JavaScript
Panagrinėkime catch bloką JSON produkto užduotyje:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Netinkamas produkto JSON');
} else if (error.name == 'ProductCostError') {
alert('Produktui trūksta kainos arba kiekio');
}
}
Kaip matote, mes sugavome dvi mūsų planuotas
išimtis ir kažkaip reaguojame į tai.
Bet kas atsitiks, jei atsiras mūsų nenumatytas
kitos rūšies išimtis? Šiuo atveju
ji taip pat pateks į catch bloką, bet
jokia reakcija į tai nebus, nes
išimtis su kitu tipu tiesiog nepateks
į nė vieną mūsų if sąlygą.
Kai sakau, kad nebus jokios reakcijos, turiu omenyje, kad tikrai jokios: net nebus klaidos išvedimo į konsolę. Mūsų kodas tiesiog tyliai neveiks.
Todėl egzistuoja tokia taisyklė: jūsų
kodas turi sugauti tik tas išimtis, su
kuriomis žino, kaip susitvarkyti. Jei išimtis
yra nepažįstama, tuomet ją reikia perleisti
toliau naudojant throw. Šiuo atveju
aukščiau ją pagaus kas nors labiau informuotas
arba išimtis bus išmesta kaip klaida į konsolę.
Pataisykime mūsų kodą:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Netinkamas produkto JSON');
} else if (error.name == 'ProductCostError') {
alert('Produktui trūksta kainos arba kiekio');
} else {
throw error; // perleidžiame išimtį toliau
}
}
Duotas toks kodas:
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('pasibaigė vietos saugykloje');
}
if (error.name == 'SyntaxError') {
alert('netinkamas JSON');
}
}
Kas negerai su šiuo kodu? Pataisykite jį į labiau tinkamą.