Υπάρχουν περισσότεροι από ένας τρόποι χειρισμού σφαλμάτων στο Rust, οπότε βεβαιωθείτε ότι έχετε λάβει υπόψη όλες τις επιλογές.

Τα σφάλματα είναι αναπόφευκτα και μπορεί να προκύψουν για διάφορους λόγους, από μη έγκυρη είσοδο χρήστη έως αποτυχίες δικτύου, δυσλειτουργίες υλικού ή σφάλματα προγραμματισμού. Ο χειρισμός σφαλμάτων είναι η διαδικασία εντοπισμού, αναφοράς και ανάκτησης από τέτοια σφάλματα για την αποφυγή σφαλμάτων προγράμματος ή καταστροφής δεδομένων.

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

Οι τύποι σφαλμάτων στη σκουριά

Το Rust έχει ένα πλούσιο σύστημα τύπου που μπορείτε να χρησιμοποιήσετε χειριστείτε σωστά τα λάθη, ανάλογα με τους τύπους τους. Τα οφέλη του πλούσιου συστήματος τύπου σφάλματος της Rust σε σχέση με τις παραδοσιακές προσεγγίσεις χειρισμού σφαλμάτων δεν μπορούν να υποτιμηθούν. Το σύστημα τύπου σφάλματος παρέχει

instagram viewer
βελτιωμένη ασφάλεια τύπου, συνθεσιμότητα, εκφραστικότητα και δυνατότητα εντοπισμού σφαλμάτων.

Ακολουθεί μια λίστα κοινών τύπων σφαλμάτων στο Rust:

  • ο std:: io:: Σφάλμα Ο τύπος αντιπροσωπεύει σφάλματα εισόδου/εξόδου, όπως το αρχείο που δεν βρέθηκε, η άδεια δεν έγινε δεκτή ή το τέλος του αρχείου έφτασε.
  • ο std:: num:: ParseIntError Ο τύπος αντιπροσωπεύει σφάλματα που εμφανίζονται σε λειτουργίες ανάλυσης συμβολοσειρών σε ακέραιους αριθμούς.
  • ο std:: option:: NoneError ο τύπος αντιπροσωπεύει σφάλματα από το ξετύλιγμα των κενών Επιλογών.
  • ο std:: αποτέλεσμα:: Αποτέλεσμα Ο τύπος είναι ένας γενικός τύπος αποτελεσμάτων που μπορείτε να χρησιμοποιήσετε για να αναπαραστήσετε οποιοδήποτε σφάλμα.

Κάθε τύπος σφάλματος έχει το δικό του σύνολο μεθόδων και χαρακτηριστικών για τον χειρισμό του με συγκεκριμένους τρόπους.

Ακολουθεί ένα παράδειγμα χειρισμού σφαλμάτων στο Rust για μια λειτουργία ανάγνωσης αρχείων:

χρήση std:: fs:: Αρχείο;
χρήση std:: io:: Διαβάστε;

στread_file(διαδρομή: &str) -> Αποτέλεσμα<Σειρά, std:: io:: Σφάλμα> {
αφήνωmut αρχείο = Αρχείο:: άνοιγμα (διαδρομή);
αφήνωmut περιεχόμενα = Σειρά::νέος();
file.read_to_string(&mut περιεχόμενα)?;
Εντάξει(περιεχόμενα)
}

ο read_file Η συνάρτηση διαβάζει τα περιεχόμενα του αρχείου στην καθορισμένη διαδρομή και το επιστρέφει ως συμβολοσειρά. Επιστρέφει α std:: io:: Σφάλμα εάν αποτύχει η λειτουργία ανοίγματος ή ανάγνωσης του αρχείου. ο ? Ο χειριστής διαδίδει το σφάλμα και επιστρέφει το σφάλμα ως a Αποτέλεσμα.

Μηχανισμοί χειρισμού σφαλμάτων στη σκουριά

Ένα βασικό χαρακτηριστικό που συμβάλλει στην ασφάλεια του Rust είναι οι μηχανισμοί χειρισμού σφαλμάτων του. Υπάρχουν τέσσερις κύριοι μηχανισμοί χειρισμού σφαλμάτων στο Rust: ο Αποτέλεσμα τύπος, η Επιλογή τύπος, η πανικός! μακροεντολή, και το Λάθος χαρακτηριστικό.

Οι τύποι Αποτέλεσμα και Επιλογή επιτρέπουν τον δομημένο χειρισμό σφαλμάτων. Μπορείτε να χρησιμοποιήσετε τον πανικό! μακροεντολή για τη διαχείριση μη ανακτήσιμων σφαλμάτων. Το χαρακτηριστικό Σφάλμα σάς επιτρέπει να ορίσετε προσαρμοσμένους τύπους σφαλμάτων και προσαρμοσμένο χειρισμό σφαλμάτων.

Ο τύπος αποτελέσματος

ο Αποτέλεσμα Ο τύπος είναι ένας ενσωματωμένος τύπος που αντιπροσωπεύει το αποτέλεσμα μιας λειτουργίας που μπορεί να αποτύχει. Έχει δύο παραλλαγές: το Εντάξει παραλλαγή, η οποία αντιπροσωπεύει την επιτυχία και περιέχει μια τιμή, και Πλανώμαι, το οποίο αντιπροσωπεύει την αποτυχία και περιέχει μια τιμή σφάλματος.

Δείτε πώς μπορείτε να χρησιμοποιήσετε τον τύπο Αποτέλεσμα για να ανοίξετε ένα αρχείο και να διαβάσετε τα περιεχόμενά του:

χρήση std:: fs:: Αρχείο;
χρήση std:: io:: πρελούδιο::*;

στread_file(διαδρομή αρχείου: &str) -> Αποτέλεσμα<Σειρά, std:: io:: Σφάλμα> {
αφήνωmut file = File:: open (file_path);
αφήνωmut περιεχόμενα = Σειρά::νέος();
file.read_to_string(&mut περιεχόμενα)?;
Εντάξει(περιεχόμενα)
}

στκύριος() {
αφήνω αποτέλεσμα = read_file("file.txt");

αγώνας αποτέλεσμα {
Εντάξει(περιεχόμενα) => println!("{}", περιεχόμενα),
Πλανώμαι(ε) => println!("Λάθος: {}", ε),
}
}

ο read_file η συνάρτηση παίρνει τη διαδρομή του αρχείου και επιστρέφει a Αποτέλεσμα λάθος. Εάν η λειτουργία ανάγνωσης ή ανοίγματος αρχείου αποτύχει, η συνάρτηση επιστρέφει το Πλανώμαι αξία. Διαφορετικά, η συνάρτηση επιστρέφει το Εντάξει αξία. Στο κύριος λειτουργία, η αγώνας δήλωση χειρίζεται το Αποτέλεσμα τιμή και εκτυπώνει το αποτέλεσμα ανάλογα με την κατάσταση της λειτουργίας του αρχείου.

Ο τύπος επιλογής

ο Επιλογή Ο τύπος είναι ένας ενσωματωμένος τύπος που αντιπροσωπεύει την παρουσία ή την απουσία μιας τιμής. ο Επιλογή ο τύπος έχει δύο παραλλαγές. Μερικοί αντιπροσωπεύει μια τιμή και Κανένας αντιπροσωπεύει την απουσία τιμής.

Δείτε πώς μπορείτε να χρησιμοποιήσετε το Επιλογή πληκτρολογήστε για να ανακτήσετε το πρώτο στοιχείο ενός διανύσματος.

στget_first_elementΚλώνος>(vec: Vec) -> Επιλογή {
αν vec.is_empty() {
Κανένας
} αλλού {
Μερικοί(vec.first().unwrap().clone())
}
}

στκύριος() {
αφήνω vec = vec![1, 2, 3];
αφήνω αποτέλεσμα = get_first_element (vec);

αγώνας αποτέλεσμα {
Μερικοί(στοιχείο) => println!("{}", στοιχείο),
Κανένας => println!("Το διάνυσμα είναι κενό."),
}
}

ο get_first_element η συνάρτηση επιστρέφει an Επιλογή τύπος. Εάν το διάνυσμα είναι κενό, η συνάρτηση επιστρέφει Κανένας; Διαφορετικά, η συνάρτηση επιστρέφει Μερικοί που περιέχει το πρώτο στοιχείο του διανύσματος. Στο κύριος λειτουργία, η αγώνας δήλωση χειρίζεται το Επιλογή αξία. Αν το Επιλογή αξιολογεί να Μερικοί, η συνάρτηση εκτυπώνει το πρώτο στοιχείο. Διαφορετικά, η συνάρτηση εκτυπώνει ένα μήνυμα που υποδεικνύει ότι το διάνυσμα είναι κενό.

Ο πανικός! Μακροεντολή

ο πανικός! Η μακροεντολή παρέχει λειτουργικότητα για το χειρισμό μη ανακτήσιμων σφαλμάτων στο Rust. Με την κλήση του πανικός! μακροεντολή, εκτυπώνει ένα μήνυμα σφάλματος και τερματίζει το πρόγραμμα.

Εδώ είναι ένα παράδειγμα χρήσης πανικού! μακροεντολή για να υποδείξει ότι μια συνάρτηση έχει μη έγκυρα ορίσματα.

στδιαιρέστε(μέρισμα: f64, διαιρέτης: f64) -> f64 {
αν διαιρέτης == 0.0 {
πανικός!(«Ο διαιρέτης δεν μπορεί να είναι μηδέν».);
}

μέρισμα / διαιρέτης
}

στκύριος() {
αφήνω αποτέλεσμα = διαίρεση(4.0, 0.0);
println!("{}", αποτέλεσμα)·
}

ο διαιρέστε Η συνάρτηση ελέγχει εάν ο διαιρέτης είναι μηδέν. αν ο διαιρέτης είναι μηδέν, η συνάρτηση καλεί το πανικός! μακροεντολή με μήνυμα σφάλματος. Διαφορετικά, η συνάρτηση υπολογίζει και επιστρέφει το αποτέλεσμα

ο κύριος Η συνάρτηση καλεί τη συνάρτηση διαίρεσης με μη έγκυρα ορίσματα για την ενεργοποίηση του πανικός! μακροεντολή.

Εδώ είναι το μήνυμα σφάλματος:

Το χαρακτηριστικό του σφάλματος

ο Λάθος Το χαρακτηριστικό είναι ένα ενσωματωμένο χαρακτηριστικό που καθορίζει τη συμπεριφορά των τύπων σφαλμάτων. ο Λάθος Το χαρακτηριστικό παρέχει λειτουργικότητα για τον καθορισμό προσαρμοσμένων τύπων σφαλμάτων και προσαρμοσμένο χειρισμό σφαλμάτων.

Ακολουθεί ένα παράδειγμα καθορισμού ενός προσαρμοσμένου τύπου σφάλματος που αντιπροσωπεύει ένα σφάλμα που δεν βρέθηκε αρχείο.

χρήση std:: σφάλμα:: Σφάλμα;
χρήση std:: fmt;
χρήση std:: io:: Διαβάστε;

#[παραγωγή (Εντοπισμός σφαλμάτων)]
structΤο αρχείο δε βρέθηκε(Σειρά);

υπονοώ fmt:: Εμφάνιση Για Το αρχείο δε βρέθηκε {
στfmt(&εαυτός, στ: &mut fmt:: Μορφοποιητής) -> fmt::Αποτέλεσμα {
γράφω!(φά, "Το αρχείο δε βρέθηκε: {}", εαυτός.0)
}
}

υπονοώ Λάθος Για Το αρχείο δε βρέθηκε {}

στread_file(διαδρομή αρχείου: &str) -> Αποτέλεσμα<Σειρά, Κουτί<dyn Σφάλμα >> {
αφήνωmut file = std:: fs:: Αρχείο:: open (file_path).map_err(|e| FileNotFound(μορφή!("{}", ε)))?;
αφήνωmut περιεχόμενα = Σειρά::νέος();
file.read_to_string(&mut περιεχόμενα)?;
Εντάξει(περιεχόμενα)
}

στκύριος() {
αφήνω αποτέλεσμα = read_file("file.txt");

αγώνας αποτέλεσμα {
Εντάξει(περιεχόμενα) => println!("{}", περιεχόμενα),
Πλανώμαι(ε) => println!("Λάθος: {}", ε),
}
}

Ο προσαρμοσμένος τύπος σφάλματος είναι ο Το αρχείο δε βρέθηκε struct. Ο τύπος περιέχει μια διαδρομή αρχείου και το Το αρχείο δε βρέθηκε τύπος υλοποιεί το Απεικόνιση χαρακτηριστικό για την επιστροφή φιλικών προς τον χρήστη μηνυμάτων σφάλματος και το Λάθος χαρακτηριστικό που υποδεικνύει ότι πρόκειται για τύπο σφάλματος.

Στο read_file λειτουργία, η Το αρχείο δε βρέθηκε ο τύπος σφάλματος αντιπροσωπεύει ένα σφάλμα που δεν βρέθηκε αρχείο και το map_err μέθοδος μετατρέπει το std:: io:: Σφάλμα σε σφάλμα FileNotFound. Τελικά, το κιβώτιο Ο τύπος επιτρέπει στη συνάρτηση να επιστρέψει οποιονδήποτε τύπο που υλοποιεί το χαρακτηριστικό Σφάλμα.

ο κύριος η συνάρτηση καλεί το read_file λειτουργεί με τη διαδρομή του αρχείου και, αν βρει το αρχείο, εκτυπώνει τα περιεχόμενά του στην κονσόλα. Διαφορετικά, εκτυπώνει το μήνυμα σφάλματος.

Ακολουθεί το αποτέλεσμα για ένα αρχείο που δεν υπάρχει:

Μπορείτε να βασιστείτε στο μοντέλο ιδιοκτησίας της Rust για την ασφάλεια του προγράμματος

Σε συνδυασμό με τον υπέροχο μηχανισμό χειρισμού σφαλμάτων της Rust, η Rust χρησιμοποιεί επίσης ένα μοντέλο ιδιοκτησίας που βοηθά να διασφαλίσετε ότι τα προγράμματά σας είναι ασφαλή στη μνήμη.

Το Rust διασφαλίζει τους κανόνες ιδιοκτησίας με έναν ελεγκτή δανείου κατά τη στιγμή της μεταγλώττισης πριν από την εκτέλεση του προγράμματός σας.