Τα σφάλματα είναι χρήσιμα για να αναφέρεις πότε κάτι πάει λάθος ή είναι απρόσμενο σε ένα πρόγραμμα ή σε ένα κομμάτι κώδικα.
Είναι αντικείμενα JavaScript.
Η κύρια ιδιότητα αυτού του αντικειμένου είναι το message:
const error = new Error('Oops, something went wrong');
console.log(error.message);
// => "Oops, something went wrong"
Χρησιμοποιώντας τη σύνταξη throw, μπορείς να πετάξεις ένα σφάλμα.
throw new Error('Oops');
Όταν πεταχτεί ένα σφάλμα, η τρέχουσα εκτέλεση σταματάει και συνεχίζεται στο πρώτο μπλοκ catch της στοίβας κλήσεων.
try {
throw new Error('Oops');
} catch (error) {
console.log(error.message);
// => "Oops"
}
Η κληρονομικότητα είναι ένας τρόπος να δημιουργείς σχέσεις γονέα-παιδιού ανάμεσα σε κλάσεις. Η θυγατρική κλάση (που μερικές φορές αναφέρεται ως υποκλάση) έχει πρόσβαση στη συμπεριφορά και στα δεδομένα που ορίζει η γονική κλάση (που μερικές φορές αναφέρεται ως υπερκλάση).
class Pet {
constructor(name) {
this.name = name;
}
introduce() {
console.log(`This is my pet, ${this.name}.`);
}
}
class Dog extends Pet {}
const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.
Η λέξη-κλειδί extends στη δήλωση της θυγατρικής κλάσης δημιουργεί μια σχέση με τη γονική κλάση μέσω της αλυσίδας πρωτοτύπων.
Τα αντικείμενα που δημιουργεί ο κατασκευαστής της θυγατρικής κλάσης θα έχουν το πρωτότυπο της γονικής κλάσης στην αλυσίδα πρωτοτύπων τους, δίνοντας πρόσβαση σε οποιεσδήποτε μεθόδους ή δεδομένα ορίζει η γονική κλάση.
const dog = new Dog('Otis');
Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true
Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false
Όπως με κάθε κλάση στη JavaScript, οι υποκλάσεις μπορούν να κληρονομήσουν από το Error για να δημιουργήσουν προσαρμοσμένα σφάλματα χρησιμοποιώντας τη λέξη-κλειδί extends.
Η σύνταξη instanceof ελέγχει αν το σφάλμα που πιάστηκε είναι στιγμιότυπο μιας συγκεκριμένης υποκλάσης του Error.
class CustomError extends Error {}
try {
// ... Code that may throw an error
} catch (error) {
if (error instanceof CustomError) {
console.log('The error thrown is an instance of the CustomError');
}
}
Η Elena είναι η νέα διευθύντρια ποιότητας ενός εργοστασίου εφημερίδων. Μόλις έφτασε στην εταιρεία, αποφάσισε να εξετάσει κάποιες από τις διαδικασίες του εργοστασίου για να δει τι θα μπορούσε να βελτιωθεί. Ανακάλυψε ότι οι τεχνικοί κάνουν πολλούς ποιοτικούς ελέγχους χειροκίνητα. Βλέπει μια καλή ευκαιρία για αυτοματοποίηση και σου ζητάει, ως ανεξάρτητος προγραμματιστής, να αναπτύξεις ένα λογισμικό που να παρακολουθεί κάποιες από τις μηχανές.
Η πρώτη σου αποστολή είναι να γράψεις ένα λογισμικό για να παρακολουθείς το επίπεδο υγρασίας του δωματίου παραγωγής. Υπάρχει ήδη ένας αισθητήρας συνδεδεμένος με το λογισμικό της εταιρείας που επιστρέφει περιοδικά το ποσοστό υγρασίας του δωματίου.
Πρέπει να υλοποιήσεις μια συνάρτηση στο λογισμικό που θα πετάει ένα σφάλμα αν το ποσοστό υγρασίας είναι πολύ υψηλό.
Η συνάρτηση θα πρέπει να ονομάζεται checkHumidityLevel και να παίρνει ως παράμετρο το ποσοστό υγρασίας.
Θα πρέπει να πετάξεις ένα σφάλμα (το μήνυμα δεν έχει σημασία) αν το ποσοστό ξεπερνά το 70%.
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
Η Elena είναι πολύ ευχαριστημένη με την πρώτη σου εργασία και σου ζητάει να ασχοληθείς με την παρακολούθηση της θερμοκρασίας των μηχανών. Καθώς κουβεντιάζεις με έναν τεχνικό, τον Greg, μαθαίνεις ότι αν η θερμοκρασία μιας μηχανής ξεπερνά τους 500°C, οι τεχνικοί αρχίζουν να ανησυχούν για υπερθέρμανση.
Η μηχανή είναι εξοπλισμένη με έναν αισθητήρα που μετρά την εσωτερική της θερμοκρασία. Θα πρέπει να ξέρεις ότι ο αισθητήρας είναι πολύ ευαίσθητος και συχνά χαλάει. Σε αυτή την περίπτωση, οι τεχνικοί θα χρειαστεί να τον αλλάξουν.
Η δουλειά σου είναι να υλοποιήσεις μια συνάρτηση reportOverheating που παίρνει ως παράμετρο τη θερμοκρασία και πετάει ένα σφάλμα αν ο αισθητήρας είναι χαλασμένος ή αν η μηχανή αρχίζει να υπερθερμαίνεται.
Γνωρίζοντας ότι αργότερα θα χρειαστεί να αντιδράσεις διαφορετικά ανάλογα με το σφάλμα, χρειάζεσαι έναν μηχανισμό για να ξεχωρίζεις τα δύο είδη σφαλμάτων.
Θα μπορούσες να βασιστείς στα μηνύματα σφάλματος, αλλά αυτό θα έκανε τον κώδικά σου εύθραυστο, καθώς θα έσπαγε αν το μήνυμα ενημερωνόταν.
Έτσι, για να μπορέσεις να το κάνεις σωστά, θα πετάξεις στιγμιότυπα διαφορετικών κλάσεων σφαλμάτων.
null.
Σε αυτή την περίπτωση, θα πρέπει να πετάξεις ένα ArgumentError.OverheatingError.
Θα δημιουργήσεις στιγμιότυπο αυτής της κλάσης σφάλματος με όρισμα θερμοκρασίας.
Βεβαιώσου ότι το OverheatingError που πετάς έχει συνδεδεμένη μια ιδιότητα temperature.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
Τώρα που η μηχανή σου μπορεί να ανιχνεύει σφάλματα, θα υλοποιήσεις μια συνάρτηση που αντιδρά σε αυτά τα σφάλματα με διαφορετικούς τρόπους:
Υλοποίησε μια συνάρτηση monitorTheMachine που παίρνει ως όρισμα το actions.
Το actions είναι ένα αντικείμενο που έχει 4 ιδιότητες:
| ιδιότητα | περιγραφή |
|---|---|
check |
μια συνάρτηση. Ελέγχει τη θερμοκρασία της μηχανής. Μπορεί να πετάξει διάφορα σφάλματα. |
alertDeadSensor |
μια συνάρτηση. Ειδοποιεί έναν τεχνικό ότι ο αισθητήρας θερμοκρασίας είναι χαλασμένος. |
alertOverheating |
μια συνάρτηση. Θα ανάψει μια προειδοποιητική λυχνία στη μηχανή. |
shutdown |
μια συνάρτηση. Θα σβήσει τη μηχανή. |
Η συνάρτηση monitorTheMachine(actions) θα πρέπει να καλεί εσωτερικά το check().
Αν αυτό περάσει, η συνάρτηση δεν θα πρέπει να επιστρέφει τίποτα.
Αν αυτό πετάξει ένα σφάλμα (throw), αναμένεται διαφορετική συμπεριφορά:
| εξαίρεση | αναμενόμενη συμπεριφορά |
|---|---|
ArgumentError |
κάλεσε τη συνάρτηση alertDeadSensor. |
OverheatingError |
εκτέλεσε το πρωτόκολλο υπερθέρμανσης. |
| (οτιδήποτε άλλο) | πέταξε ξανά το σφάλμα |
Πρωτόκολλο υπερθέρμανσης
Αν η θερμοκρασία είναι μικρότερη από 600 °C, άναψε την προειδοποιητική λυχνία καλώντας τη συνάρτηση alertOverheating.
Αν η θερμοκρασία ξεπερνά τους 600 °C, η κατάσταση είναι κρίσιμη, οπότε κάλεσε τη συνάρτηση shutdown.
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});
Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.