Undantagskastning i JavaScript

Låt oss betrakta catch-blocket i uppgiften med JSON-produkt:

javascriptcatch (error) {
  if (error.name == 'SyntaxError') {
    alert('Ogiltig JSON för produkten');
  } else if (error.name == 'ProductCostError') {
    alert('Produkten saknar pris eller kvantitet');
  }
}

Som du ser, fångar vi två undantag som vi har planerat för och reagerar på något sätt. Men vad händer om ett oförutsett undantag av en annan typ uppstår? I det fallet kommer det också att hamna i catch-blocket, men ingen reaktion kommer att följa, eftersom undantaget med en annan typ helt enkelt inte kommer att träffa någon av våra if-satser.

När jag säger att det inte kommer att bli någon reaktion, menar jag att det verkligen inte blir någon: inte ens ett fel som skrivs ut till konsolen. Vår kod kommer helt enkelt att fortsätta utan att fungera.

Därför finns följande regel: din kod ska endast fånga de undantag som den vet hur den ska hantera. Om undantaget är okänt, måste det kastas vidare med hjälp av throw. I det fallet kommer någon med bättre koll att fånga det högre upp, eller så kommer undantaget att skrivas ut som ett fel i konsolen.

Låt oss rätta till vår kod:

javascriptcatch (error) {
  if (error.name == 'SyntaxError') {
    alert('Ogiltig JSON för produkten');
  } else if (error.name == 'ProductCostError') {
    alert('Produkten saknar pris eller kvantitet');
  } else {
    throw error; // kastar undantaget vidare
  }
}
Задание 1

Följande kod ges:

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('slut på utrymme i lagringen');
  }
  
  if (error.name == 'SyntaxError') {
    alert('ogiltig JSON');
  }
}

Vad är fel med den här koden? Råtta den till en bättre version.