Prosleđivanje izuzetaka u JavaScript-u
Razmotrimo blok catch zadatka sa JSON proizvoda:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nekorektan JSON proizvoda');
} else if (error.name == 'ProductCostError') {
alert('Proizvodu nedostaje cena ili količina');
}
}
Kao što vidite, hvatamo dva od nas planirana
izuzetka i na neki način reagujemo na to.
Ali šta će se desiti ako se pojavi nepredviđeno
izuzetak drugog tipa? U tom slučaju
on će takođe upasti u blok catch, ali
nikakva reakcija na to neće uslediti, jer
izuzetak drugog tipa jednostavno neće upasti
ni u jedan od naših if-ova.
Kada kažem da neće biti nikakve reakcije, mislim da stvarno nikakve: čak neće biti ni ispisivanja greške u konzolu. Naš kod će jednostavno ćutati i neće raditi.
Zato postoji sledeće pravilo: vaš
kod treba da hvata samo one izuzetke sa
kojima zna kako da se izbori. Ako je izuzetak
nepoznat, onda ga treba proslediti
dalje pomoću throw. U tom slučaju
iznad će ga uhvatiti neko bolje upućen
ili će se izuzetak ispisati kao greška u konzolu.
Hajde da ispravimo naš kod:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nekorektan JSON proizvoda');
} else if (error.name == 'ProductCostError') {
alert('Proizvodu nedostaje cena ili količina');
} else {
throw error; // prosleđujemo izuzetak dalje
}
}
Dat je sledeći kod:
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('ponestalo je mesta u skladištu');
}
if (error.name == 'SyntaxError') {
alert('nekorektan JSON');
}
}
Šta nije u redu sa ovim kodom? Ispravite ga na bolju verziju.