Preposielanie výnimiek v JavaScripte

Pozrime sa na blok catch úlohy s JSON produktu:

javascriptcatch (error) {
  if (error.name == 'SyntaxError') {
    alert('Nekorektný JSON produktu');
  } else if (error.name == 'ProductCostError') {
    alert('Produkt nemá cenu alebo množstvo');
  }
}

Ako vidíte, chytáme dve plánované výnimky a nejako na ne reagujeme. Ale čo sa stane, ak nastane neplánovaná výnimka iného typu? V tomto prípade tiež padne do bloku catch, ale žiadna reakcia na ňu nenastane, pretože výnimka s iným typom jednoducho nespadne do žiadneho z našich podmienených blokov.

Keď hovorím, že nebude žiadna reakcia, myslím tým, že skutočne žiadna: dokonca nebude žiadny výpis chyby do konzoly. Náš kód bude jednoducho mlčať a nefungovať.

Preto existuje nasledujúce pravidlo: váš kód by mal chytiť len tie výnimky, s ktorými vie, ako si poradiť. Ak je výnimka neznáma, treba ju preposlať ďalej pomocou throw. V tomto prípade ju vyššie chytí niekto lepšie informovaný alebo výnimka vypíše chybu do konzoly.

Opravme náš kód:

javascriptcatch (error) {
  if (error.name == 'SyntaxError') {
    alert('Nekorektný JSON produktu');
  } else if (error.name == 'ProductCostError') {
    alert('Produkt nemá cenu alebo množstvo');
  } else {
    throw error; // preposielame výnimku ďalej
  }
}
Задание 1

Daný je nasledujúci kód:

javascripttry {
  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 miesto v úložisku');
  }
  
  if (error.name == 'SyntaxError') {
    alert('nekorektný JSON');
  }
}

Čo je zlé na tomto kóde? Opravte ho na vhodnejší.