Τι είναι το Exception Handling στο C ++;
Ο χειρισμός εξαίρεσης στο C ++ σάς παρέχει έναν τρόπο χειρισμού απροσδόκητων περιστάσεων, όπως σφάλματα χρόνου εκτέλεσης. Έτσι, όταν συμβαίνει μια απροσδόκητη περίσταση, ο έλεγχος του προγράμματος μεταφέρεται σε ειδικές λειτουργίες γνωστές ως χειριστές.
Για να δείτε τις εξαιρέσεις, τοποθετείτε ένα τμήμα κώδικα υπό έλεγχο εξαίρεσης. Το τμήμα του κώδικα τοποθετείται εντός του μπλοκ δοκιμής.
Εάν παρουσιαστεί μια εξαιρετική κατάσταση σε αυτό το τμήμα του κώδικα, θα εξαχθεί μια εξαίρεση. Στη συνέχεια, ο διαχειριστής εξαιρέσεων θα αναλάβει τον έλεγχο του προγράμματος.
Σε περίπτωση που δεν συμβεί εξαιρετική περίσταση, ο κώδικας θα εκτελείται κανονικά. Οι χειριστές θα αγνοηθούν.
Σε αυτό το σεμινάριο C ++, θα μάθετε:
- Τι είναι το Exception Handling στο C ++;
- Γιατί χειρισμός εξαιρέσεων;
- Λέξεις κλειδιά εξαίρεσης
- Σύνταξη:
- Τυπικές εξαιρέσεις C ++
- Εξαιρέσεις που καθορίζονται από τον χρήστη
Γιατί χειρισμός εξαιρέσεων;
Εδώ είναι οι λόγοι για τη χρήση του Exception Handling στο C ++:
- Θα διαχωρίσετε τον κωδικό χειρισμού σφαλμάτων από τον κανονικό σας κωδικό. Ο κωδικός θα είναι πιο ευανάγνωστος και ευκολότερος στη συντήρηση.
- Οι λειτουργίες μπορούν να χειριστούν τις εξαιρέσεις που επιλέγουν. Ακόμα κι αν μια συνάρτηση ρίχνει πολλές εξαιρέσεις, θα χειριστεί μόνο μερικές. Ο καλών θα χειριστεί τις αχρείαστες εξαιρέσεις.
Λέξεις κλειδιά εξαίρεσης
Ο χειρισμός εξαίρεσης στο C ++ περιστρέφεται γύρω από αυτές τις τρεις λέξεις-κλειδιά:
- ρίξτε - όταν ένα πρόγραμμα συναντά ένα πρόβλημα, ρίχνει μια εξαίρεση. Η λέξη-κλειδί ρίχνει το πρόγραμμα να εκτελεί τη ρίψη.
- catch - ένα πρόγραμμα χρησιμοποιεί χειριστή εξαίρεσης για να πιάσει μια εξαίρεση. Προστίθεται στην ενότητα ενός προγράμματος όπου πρέπει να χειριστείτε το πρόβλημα. Έγινε χρησιμοποιώντας τη λέξη-κλειδί catch.
- try - το μπλοκ try προσδιορίζει το μπλοκ κώδικα για το οποίο θα ενεργοποιηθούν ορισμένες εξαιρέσεις. Θα πρέπει να ακολουθείται από ένα / περισσότερα μπλοκ.
Ας υποθέσουμε ότι ένα μπλοκ κώδικα θα δημιουργήσει μια εξαίρεση. Η εξαίρεση θα εντοπιστεί με μια μέθοδο χρησιμοποιώντας λέξεις-κλειδιά δοκιμής και σύλληψης Το μπλοκ try / catch πρέπει να περιβάλλει κώδικα που μπορεί να φέρει εξαίρεση. Αυτός ο κωδικός είναι γνωστός ως προστατευμένος κώδικας.
Σύνταξη:
Η δοκιμή / catch παίρνει αυτήν τη σύνταξη:
try {// the protected code} catch( Exception_Name exception1 ) {// catch block} catch( Exception_Name exception2 ) {// catch block} catch( Exception_Name exceptionN ) {// catch block}
- Παρόλο που έχουμε μια δήλωση δοκιμής, μπορούμε να έχουμε πολλές δηλώσεις αλιευμάτων.
- Το ExceptionName είναι το όνομα της εξαίρεσης που πρέπει να πιάσετε.
- Οι εξαιρέσεις1, εξαίρεση2 και εξαίρεσηN είναι τα καθορισμένα ονόματά σας για αναφορά στις εξαιρέσεις.
Παράδειγμα 1:
#include#include using namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}
Παραγωγή:
Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:
Επεξήγηση κώδικα:
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμα για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το διανυσματικό αρχείο κεφαλίδας στο πρόγραμμα για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το χώρο ονομάτων στο πρόγραμμα στις τάξεις του χωρίς να το καλέσετε.
- Καλέστε την κύρια λειτουργία (). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα του.
- Δημιουργήστε ένα διάνυσμα που ονομάζεται vec για να αποθηκεύσετε ακέραια δεδομένα.
- Προσθέστε το στοιχείο 0 στο διάνυσμα που ονομάζεται vec.
- Προσθέστε το στοιχείο 1 στο διάνυσμα που ονομάζεται vec.
- Ενα σχόλιο. Θα παραλειφθεί από τον μεταγλωττιστή C ++.
- Χρησιμοποιήστε τη δήλωση δοκιμής για να βρείτε μια εξαίρεση. Το {σηματοδοτεί την αρχή του σώματος του μπλοκ try / catch. Ο κωδικός που προστίθεται μέσα στο σώμα θα γίνει ο προστατευμένος κωδικός.
- Προσπαθήστε να αποκτήσετε πρόσβαση στο στοιχείο που είναι αποθηκευμένο στο ευρετήριο 2 (τρίτο στοιχείο) του διανύσματος που ονομάζεται vec. Αυτό το στοιχείο δεν υπάρχει.
- Τέλος του σώματος του μπλοκ δοκιμής / σύλληψης.
- Πιάστε την εξαίρεση. Το επιστρεφόμενο μήνυμα σφάλματος θα αποθηκευτεί στη μεταβλητή ex.
- Εκτυπώστε κάποιο μήνυμα στην κονσόλα εάν έχει εξαχθεί η εξαίρεση.
- Άκρο του κορμού του μπλοκ σύλληψης.
- Το πρόγραμμα θα πρέπει να επιστρέψει μια τιμή κατά την επιτυχή εκτέλεση.
- Τέλος του κύριου () σώματος λειτουργίας.
Παράδειγμα 2:
#includeusing namespace std;double zeroDivision(int x, int y) {if (y == 0) {throw "Division by Zero!";}return (x / y);}int main() {int a = 11;int b = 0;double c = 0;try {c = zeroDivision(a, b);cout << c << endl;}catch (const char* message) {cerr << message << endl;}return 0;}
Παραγωγή:
Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:
Επεξήγηση κώδικα:
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμα για να χρησιμοποιήσετε τις λειτουργίες του.
- Συμπεριλάβετε το χώρο ονομάτων στο πρόγραμμα στις τάξεις του χωρίς να το καλέσετε.
- Δημιουργήστε μια συνάρτηση με το όνομα zeroDivision που παίρνει δύο ακέραια ορίσματα, x και y. Η συνάρτηση θα πρέπει να επιστρέψει ένα διπλό αποτέλεσμα.
- Χρησιμοποιήστε μια δήλωση if για να ελέγξετε εάν η τιμή του μεταβλητού ορίσματος y είναι 0. Το {σηματοδοτεί την αρχή του if body.
- Το μήνυμα που πρέπει να επιστραφεί / ρίξει εάν το y είναι 0.
- Τέλος του σώματος της δήλωσης if.
- Η συνάρτηση zeroDivision πρέπει να επιστρέφει την τιμή x / y.
- Τέλος του σώματος της λειτουργίας zeroDivision.
- Καλέστε την κύρια μέθοδο (). Το {σηματοδοτεί την αρχή αυτής της μεθόδου.
- Δηλώστε μια ακέραια μεταβλητή και εκχωρώντας την τιμή 11.
- Δηλώστε μια ακέραια μεταβλητή b και εκχωρώντας την τιμή 0.
- Δηλώστε μια διπλή μεταβλητή c και εκχωρώντας την τιμή 0.
- Χρησιμοποιήστε τη δήλωση δοκιμής για να βρείτε μια εξαίρεση. Το {σηματοδοτεί την αρχή του σώματος του μπλοκ try / catch. Ο κωδικός που προστίθεται μέσα στο σώμα θα γίνει ο προστατευμένος κωδικός.
- Καλέστε τη συνάρτηση zeroDivision και μεταβείτε στα ορίσματα a και b, δηλαδή 11 και 0. Το αποτέλεσμα αυτής της λειτουργίας θα αποθηκευτεί στη μεταβλητή c.
- Εκτυπώστε την τιμή της μεταβλητής c στην κονσόλα.
- Τέλος του σώματος του μπλοκ δοκιμής / σύλληψης.
- Πιάστε την εξαίρεση. Το επιστρεφόμενο μήνυμα σφάλματος θα αποθηκευτεί στο μεταβλητό μήνυμα.
- Εκτυπώστε το επιστρεφόμενο μήνυμα σφάλματος στην κονσόλα.
- Άκρο του κορμού του μπλοκ σύλληψης.
- Το πρόγραμμα θα πρέπει να επιστρέψει μια τιμή κατά την επιτυχή εκτέλεση.
- Τέλος του κύριου () σώματος λειτουργίας.
Τυπικές εξαιρέσεις C ++
Το C ++ συνοδεύεται από μια λίστα τυπικών εξαιρέσεων που ορίζονται στην κατηγορία
Εξαίρεση | Περιγραφή |
std :: εξαίρεση | Αυτή είναι μια εξαίρεση και η γονική τάξη όλων των τυπικών εξαιρέσεων C ++. |
std :: bad_alloc | Αυτή η εξαίρεση απορρίπτεται από μια νέα λέξη-κλειδί. |
std :: bad_cast | Αυτή είναι μια εξαίρεση που ρίχνεται από το dynamic_cast. |
std :: bad_exception | Μια χρήσιμη συσκευή για τον χειρισμό απροσδόκητων εξαιρέσεων σε προγράμματα C ++. |
std :: bad_typeid | Μια εξαίρεση που απορρίφθηκε από τον τύπο. |
std :: logic_error | Αυτή η εξαίρεση είναι θεωρητικά ανιχνεύσιμη με ανάγνωση κώδικα. |
std :: domain_error | Αυτή είναι μια εξαίρεση που απορρίφθηκε μετά τη χρήση ενός μαθηματικά μη έγκυρου τομέα. |
std :: valid_argument | Έγινε εξαίρεση για τη χρήση μη έγκυρων ορισμάτων. |
std :: length_error | Μια εξαίρεση που δημιουργήθηκε μετά τη δημιουργία μιας μεγάλης συμβολοσειράς std ::. |
std :: out_of_range | Πετάχτηκε από τη μέθοδο. |
std :: runtime_error | Αυτή είναι μια εξαίρεση που δεν μπορεί να εντοπιστεί με την ανάγνωση του κώδικα. |
std :: overflow_error | Αυτή η εξαίρεση απορρίπτεται μετά την εμφάνιση μαθηματικής υπερχείλισης. |
std :: range_error | Αυτή η εξαίρεση απορρίπτεται όταν προσπαθείτε να αποθηκεύσετε μια τιμή εκτός εύρους. |
std :: underflow_error | Μια εξαίρεση που απορρίφθηκε μετά την εμφάνιση μαθηματικής υπεροχής. |
Εξαιρέσεις που καθορίζονται από τον χρήστη
Η C ++ std :: εξαίρεση κλάση μας επιτρέπει να ορίσουμε αντικείμενα που μπορούν να ρίχνονται ως εξαιρέσεις. Αυτή η τάξη έχει οριστεί στην κεφαλίδα
Αυτή η συνάρτηση επιστρέφει μια μηδενική τερματική ακολουθία χαρακτήρων τύπου char *. Μπορούμε να το αντικαταστήσουμε σε παράγωγες τάξεις για να έχουμε μια περιγραφή εξαίρεσης.
Παράδειγμα:
#include#include using namespace std;class newException : public exception{virtual const char* what() const throw(){return "newException occurred";}} newex;int main() {try {throw newex;}catch (exception& ex) {cout << ex.what() << '\n';}return 0;}
Παραγωγή:
Ακολουθεί ένα στιγμιότυπο οθόνης του κώδικα:
Επεξήγηση κώδικα:
- Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας. Θα χρησιμοποιήσουμε τις λειτουργίες του χωρίς λάθη.
- Συμπεριλάβετε το αρχείο κεφαλίδας εξαίρεσης στο πρόγραμμά μας. Θα χρησιμοποιήσουμε τις λειτουργίες του όπως αυτό χωρίς λάθη.
- Συμπεριλάβετε το std namespace στο πρόγραμμά μας για να χρησιμοποιήσετε τις τάξεις του χωρίς να το καλέσετε.
- Δημιουργήστε μια νέα τάξη με το όνομα newException. Αυτή η τάξη κληρονομεί την κατηγορία εξαίρεσης του C ++.
- Η αρχή του σώματος της τάξης.
- Αντικαταστήστε τη συνάρτηση εικονικού μέλους τι () ορίζεται στο αρχείο κεφαλίδας εξαίρεσης. Στη συνέχεια θα περιγράψουμε τη δική μας εξαίρεση, τη νέα εξαίρεση.
- Ξεκινήστε τον ορισμό της νέας εξαίρεσης.
- Το μήνυμα που πρέπει να επιστραφεί εάν εντοπιστεί η νέα εξαίρεση.
- Τέλος του ορισμού της νέας εξαίρεσης.
- Τέλος του σώματος της κατηγορίας newException. Το newex είναι το όνομα που θα χρησιμοποιηθεί για να πιάσει τη νέα μας εξαίρεση, μετά την οποία θα κληθεί το newException.
- Καλέστε την κύρια λειτουργία (). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα του. Το {σηματοδοτεί την αρχή του σώματός του.
- Χρησιμοποιήστε μια δήλωση δοκιμής για να επισημάνετε τον κωδικό εντός του οποίου πρέπει να επισημάνουμε την εξαίρεση. Το {σηματοδοτεί την αρχή του σώματος του μπλοκ try / catch. Ο κωδικός που περιβάλλεται από αυτό θα προστατευτεί.
- Ρίξτε την εξαίρεση newex εάν έχει παγιδευτεί.
- Τέλος του δοκιμαστικού σώματος.
- Χρησιμοποιήστε τη δήλωση catch για να δείτε την εξαίρεση. Το μήνυμα σφάλματος εξαίρεσης θα αποθηκευτεί στη μεταβλητή π.χ.
- Εκτυπώστε το μήνυμα σφάλματος εξαίρεσης στην κονσόλα.
- Τέλος της δήλωσης αλιευμάτων.
- Το πρόγραμμα θα πρέπει να επιστρέφει μια τιμή εάν εκτελείται με επιτυχία.
- Τέλος του σώματος της κύριας () συνάρτησης.
Περίληψη:
- Με εξαίρεση τον χειρισμό στο C ++, μπορείτε να χειριστείτε σφάλματα χρόνου εκτέλεσης.
- Τα σφάλματα χρόνου εκτέλεσης είναι τα σφάλματα που παρουσιάζονται κατά την εκτέλεση του προγράμματος.
- Ο χειρισμός εξαίρεσης σάς βοηθά να χειριστείτε τυχόν απροσδόκητες συνθήκες στο πρόγραμμά σας.
- Όταν συμβεί το απροσδόκητο περιστατικό, ο έλεγχος προγράμματος μεταφέρεται σε χειριστές.
- Για να πάρετε μια εξαίρεση, τοποθετείτε ένα τμήμα του κώδικα κάτω από το μπλοκ δοκιμαστικού ελέγχου.
- Η λέξη-κλειδί ρίχνει το πρόγραμμα να κάνει εξαιρέσεις, βοηθώντας το πρόγραμμα να χειριστεί το πρόβλημα.
- Η λέξη-κλειδί δοκιμής βοηθά στον προσδιορισμό του μπλοκ κώδικα για το οποίο θα ενεργοποιηθούν ορισμένες εξαιρέσεις.
- Μπορούμε να αντικαταστήσουμε τη λειτουργία τι () του αρχείου κεφαλίδας εξαίρεσης για να καθορίσουμε τις εξαιρέσεις μας.