Διαβίβαση Εξαιρέσεων στο JavaScript
Ας εξετάσουμε το μπλοκ catch της εργασίας με JSON προϊόντος:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Μη έγκυρο JSON προϊόντος');
} else if (error.name == 'ProductCostError') {
alert('Το προϊόν δεν έχει τιμή ή ποσότητα');
}
}
Όπως βλέπετε, πιάνουμε δύο εξαιρέσεις που
έχουμε προγραμματίσει και αντιδρούμε με κάποιον τρόπο.
Αλλά τι θα συμβεί εάν προκύψει μια απρόβλεπτη
εξαίρεση διαφορετικού τύπου; Σε αυτήν την περίπτωση
θα μπει επίσης στο μπλοκ catch, αλλά
δεν θα ακολουθήσει καμία αντίδραση, καθώς
η εξαίρεση με διαφορετικό τύπο απλά δεν θα μπει
σε καμία από τις εντολές if μας.
Όταν λέω ότι δεν θα υπάρξει καμία αντίδραση, εννοώ πραγματικά καμία: ούτε καν θα εμφανιστεί σφάλμα στην κονσόλα. Ο κώδικάς μας απλά δεν θα λειτουργεί σιωπηλά.
Γι' αυτό υπάρχει ο ακόλουθος κανόνας: ο κώδικάς σας
πρέπει να πιάνει μόνο τις εξαιρέσεις με τις οποίες
ξέρει πώς να αντιμετωπίσει. Εάν η εξαίρεση
είναι άγνωστη, τότε πρέπει να τη διαβιβάσει
παραπέρα χρησιμοποιώντας την throw. Σε αυτήν την περίπτωση
πιο πάνω θα την πιάσει κάποιος με περισσότερες γνώσεις
ή η εξαίρεση θα εμφανιστεί ως σφάλμα στην κονσόλα.
Ας διορθώσουμε τον κώδικά μας:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Μη έγκυρο JSON προϊόντος');
} else if (error.name == 'ProductCostError') {
alert('Το προϊόν δεν έχει τιμή ή ποσότητα');
} else {
throw error; // διαβιβάζουμε την εξαίρεση παραπέρα
}
}
Δίνεται ο ακόλουθος κώδικας:
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('τελείωσε ο χώρος στην αποθήκη');
}
if (error.name == 'SyntaxError') {
alert('μη έγκυρο JSON');
}
}
Τι δεν πάει καλά με αυτόν τον κώδικα; Διορθώστε τον σε έναν πιο κατάλληλο.