Διαβίβαση Εξαιρέσεων στο JavaScript

Ας εξετάσουμε το μπλοκ catch της εργασίας με JSON προϊόντος:

javascriptcatch (error) {
  if (error.name == 'SyntaxError') {
    alert('Μη έγκυρο JSON προϊόντος');
  } else if (error.name == 'ProductCostError') {
    alert('Το προϊόν δεν έχει τιμή ή ποσότητα');
  }
}

Όπως βλέπετε, πιάνουμε δύο εξαιρέσεις που έχουμε προγραμματίσει και αντιδρούμε με κάποιον τρόπο. Αλλά τι θα συμβεί εάν προκύψει μια απρόβλεπτη εξαίρεση διαφορετικού τύπου; Σε αυτήν την περίπτωση θα μπει επίσης στο μπλοκ catch, αλλά δεν θα ακολουθήσει καμία αντίδραση, καθώς η εξαίρεση με διαφορετικό τύπο απλά δεν θα μπει σε καμία από τις εντολές if μας.

Όταν λέω ότι δεν θα υπάρξει καμία αντίδραση, εννοώ πραγματικά καμία: ούτε καν θα εμφανιστεί σφάλμα στην κονσόλα. Ο κώδικάς μας απλά δεν θα λειτουργεί σιωπηλά.

Γι' αυτό υπάρχει ο ακόλουθος κανόνας: ο κώδικάς σας πρέπει να πιάνει μόνο τις εξαιρέσεις με τις οποίες ξέρει πώς να αντιμετωπίσει. Εάν η εξαίρεση είναι άγνωστη, τότε πρέπει να τη διαβιβάσει παραπέρα χρησιμοποιώντας την throw. Σε αυτήν την περίπτωση πιο πάνω θα την πιάσει κάποιος με περισσότερες γνώσεις ή η εξαίρεση θα εμφανιστεί ως σφάλμα στην κονσόλα.

Ας διορθώσουμε τον κώδικά μας:

javascriptcatch (error) {
  if (error.name == 'SyntaxError') {
    alert('Μη έγκυρο JSON προϊόντος');
  } else if (error.name == 'ProductCostError') {
    alert('Το προϊόν δεν έχει τιμή ή ποσότητα');
  } else {
    throw error; // διαβιβάζουμε την εξαίρεση παραπέρα
  }
}
Задание 1

Δίνεται ο ακόλουθος κώδικας:

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('τελείωσε ο χώρος στην αποθήκη');
  }
  
  if (error.name == 'SyntaxError') {
    alert('μη έγκυρο JSON');
  }
}

Τι δεν πάει καλά με αυτόν τον κώδικα; Διορθώστε τον σε έναν πιο κατάλληλο.