⊗jsSpExcPrb 150 of 294 menu

Propagace výjimek v JavaScriptu

Podívejme se na blok catch úlohy s JSON produktu:

catch (error) { if (error.name == 'SyntaxError') { alert('Nekorektní JSON produktu'); } else if (error.name == 'ProductCostError') { alert('Produkt nemá cenu nebo množství'); } }

Jak vidíte, zachycujeme dvě plánované výjimky a nějak na ně reagujeme. Ale co se stane, když nastane nepředpokládaná výjimka jiného typu? V tomto případě se také dostane do bloku catch, ale nedojde k žádné reakci, protože výjimka s jiným typem jednoduše nespadne do žádného z našich ifů.

Když říkám, že nedojde k žádné reakci, myslím tím, že skutečně k žádné: ani se neobjeví chyba v konzoli. Náš kód bude jednoduše mlčky nefungovat.

Proto existuje následující pravidlo: váš kód by měl zachytávat pouze ty výjimky, se kterými ví, jak si poradit. Pokud je výjimka neznámá, je ji třeba propagovat dále pomocí throw. V tomto případě ji výše zachytí někdo lépe informovaný nebo se výjimka objeví jako chyba v konzoli.

Pojďme opravit náš kód:

catch (error) { if (error.name == 'SyntaxError') { alert('Nekorektní JSON produktu'); } else if (error.name == 'ProductCostError') { alert('Produkt nemá cenu nebo množství'); } else { throw error; // propagujeme výjimku dál } }

Je dán následující kód:

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('došlo místo v úložišti'); } if (error.name == 'SyntaxError') { alert('nekorektní JSON'); } }

Co je špatně na tomto kódu? Opravte jej na vhodnější.

hiswbnsvru