Przekazywanie wyjątków w JavaScript
Rozważmy blok catch zadania z produktem JSON:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nieprawidłowy JSON produktu');
} else if (error.name == 'ProductCostError') {
alert('Produkt nie ma ceny lub ilości');
}
}
Jak widzisz, łapiemy dwa zaplanowane przez nas
wyjątki i w jakiś sposób na nie reagujemy.
Ale co się stanie, jeśli wystąpi nieprzewidziany
przez nas wyjątek innego typu? W tym przypadku
również trafi on do bloku catch, ale
nie nastąpi żadna reakcja, ponieważ
wyjątek z innym typem po prostu nie trafi
do żadnego z naszych warunków if.
Kiedy mówię, że nie będzie żadnej reakcji, mam na myśli, że naprawdę żadnej: nawet nie będzie wyrzucenia błędu do konsoli. Nasz kod po prostu po cichu nie będzie działał.
Dlatego istnieje następująca zasada: twój
kod powinien łapać tylko te wyjątki, z
którymi wie, jak sobie poradzić. Jeśli wyjątek
jest nieznany, to należy go przekazać
dalej za pomocą throw. W tym przypadku
wyżej złapie go ktoś bardziej poinformowany
lub wyjątek zostanie wyrzucony jako błąd do konsoli.
Poprawmy nasz kod:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Nieprawidłowy JSON produktu');
} else if (error.name == 'ProductCostError') {
alert('Produkt nie ma ceny lub ilości');
} else {
throw error; // przekazujemy wyjątek dalej
}
}
Dany jest następujący 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('skończyło się miejsce w pamięci');
}
if (error.name == 'SyntaxError') {
alert('nieprawidłowy JSON');
}
}
Co jest nie tak z tym kodem? Popraw go na bardziej udany.