Posredovanje izjem v JavaScriptu
Oglejmo si blok catch naloge z JSON produkta:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nekorekten JSON produkta');
} else if (error.name == 'ProductCostError') {
alert('Produkt nima cene ali količine');
}
}
Kot vidite, ujamemo dve načrtovani
izjemi in se na to na nek način odzovemo.
Toda kaj se zgodi, če pride do nepredvidene
izjeme drugega tipa? V tem primeru
bo prav tako prišla v blok catch, vendar
se na to ne bo zgodilo nobenega odziva, saj
izjema z drugim tipom preprosto ne bo padla
v nobenega od naših if stavkov.
Ko rečem, da ne bo nobenega odziva, mislim, da resnično nobenega: celo ne bo prišlo do izpisa napake v konzolo. Naša koda preprosto ne bo delovala tiho.
Zato obstaja naslednje pravilo: vaša
koda mora ujeti samo tiste izjeme, s
katerimi ve, kako ravnati. Če je izjema
neznana, jo je treba posredovati
naprej s pomočjo throw. V tem primeru
bo izjemo ujel kdo bolj podkovan
ali pa bo izjema prišla do konzole kot napaka.
Popravimo našo kodo:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nekorekten JSON produkta');
} else if (error.name == 'ProductCostError') {
alert('Produkt nima cene ali količine');
} else {
throw error; // posredujemo izjemo naprej
}
}
Podana je naslednja koda:
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('zmanjkalo je prostora v shrambi');
}
if (error.name == 'SyntaxError') {
alert('nekorekten JSON');
}
}
Kaj je narobe s to kodo? Popravite jo na boljšo različico.