C++ Χειρισμός εξαίρεσης: Δοκίμασε, πιάσε, ρίξε Παράδειγμα

Τι είναι ο χειρισμός εξαιρέσεων C++?

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

Για να συλλάβετε τις εξαιρέσεις, τοποθετείτε κάποιο τμήμα του κώδικα υπό έλεγχο εξαίρεσης. Το τμήμα του κώδικα τοποθετείται μέσα στο μπλοκ try-catch.

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

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

Σε αυτή τη C++ tutorial, θα μάθετε:

Γιατί χειρισμός εξαιρέσεων;

Εδώ, είναι ο λόγος για τη χρήση του Exception Handling in C++:

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

Λέξεις-κλειδιά χειρισμού εξαιρέσεων

Εξαίρεση χειρισμός σε C++ περιστρέφεται γύρω από αυτές τις τρεις λέξεις-κλειδιά:

  • βολή– όταν ένα πρόγραμμα αντιμετωπίζει πρόβλημα, δημιουργεί μια εξαίρεση. Η λέξη-κλειδί ρίχνει βοηθά το πρόγραμμα να εκτελέσει τη ρίψη.
  • αλιευμάτων– ένα πρόγραμμα χρησιμοποιεί έναν χειριστή εξαιρέσεων για να εντοπίσει μια εξαίρεση. Προστίθεται στην ενότητα ενός προγράμματος όπου πρέπει να χειριστείτε το πρόβλημα. Γίνεται χρησιμοποιώντας τη λέξη-κλειδί catch.
  • προσπαθώ– το μπλοκ try προσδιορίζει το μπλοκ κώδικα για το οποίο θα ενεργοποιηθούν ορισμένες εξαιρέσεις. Θα πρέπει να ακολουθείται από ένα/περισσότερα τετράγωνα αλιευμάτων.

Ας υποθέσουμε ότι ένα μπλοκ κώδικα θα δημιουργήσει μια εξαίρεση. Η εξαίρεση θα εντοπιστεί με μια μέθοδο που χρησιμοποιεί λέξεις-κλειδιά δοκιμής και αλίευσης. Το μπλοκ try/catch θα πρέπει να περικλείει κώδικα που μπορεί να δημιουργήσει μια εξαίρεση. Ένας τέτοιος κώδικας είναι γνωστός ως προστατευμένος κώδικας.

Σύνταξη

Το try/catch παίρνει αυτή τη σύνταξη:

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}
  • Αν και έχουμε μία δήλωση δοκιμής, μπορούμε να έχουμε πολλές δηλώσεις catch.
  • Το ExceptionName είναι το όνομα της εξαίρεσης που πρέπει να συλληφθεί.
  • Η εξαίρεση1, η εξαίρεση2 και η εξαίρεσηΝ είναι τα καθορισμένα ονόματα για αναφορά στις εξαιρέσεις.

Παράδειγμα 1:

#include<iostream>
#include<vector>
using namespace std;

int main() {
	vector<int> vec;
	vec.push_back(0);	
	vec.push_back(1);	
	// access the third element, which doesn't exist
	try
	{
		vec.at(2);		
	}
	catch (exception& ex)
	{
		cout << "Exception occurred!" << endl;
	}
	return 0;
}

Παραγωγή:

Λέξεις-κλειδιά χειρισμού εξαιρέσεων

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

Λέξεις-κλειδιά χειρισμού εξαιρέσεων

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμα για να το χρησιμοποιήσετε λειτουργίες.
  2. Συμπεριλάβετε το διανυσματικό αρχείο κεφαλίδας στο πρόγραμμα για να χρησιμοποιήσετε τις λειτουργίες του.
  3. Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμα στις κλάσεις του χωρίς να τον καλέσετε.
  4. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα του.
  5. Δημιουργήστε ένα διάνυσμα με το όνομα vec για να αποθηκεύσετε ακέραια δεδομένα.
  6. Προσθέστε το στοιχείο 0 στο διάνυσμα με το όνομα vec.
  7. Προσθέστε το στοιχείο 1 στο διάνυσμα με το όνομα vec.
  8. Ενα σχόλιο. Θα παραλειφθεί από το C++ μεταγλωττιστής.
  9. Χρησιμοποιήστε τη δήλωση try για να συλλάβετε μια εξαίρεση. Το { σηματοδοτεί την αρχή του σώματος του μπλοκ try/catch. Ο κωδικός που προστίθεται στο σώμα θα γίνει ο προστατευμένος κωδικός.
  10. Προσπαθήστε να αποκτήσετε πρόσβαση στο στοιχείο που είναι αποθηκευμένο στο ευρετήριο 2 (τρίτο στοιχείο) του διανύσματος με το όνομα vec. Αυτό το στοιχείο δεν υπάρχει.
  11. Τέλος του σώματος του μπλοκ try/catch.
  12. Πιάσε την εξαίρεση. Το επιστρεφόμενο μήνυμα σφάλματος θα αποθηκευτεί στη μεταβλητή ex.
  13. Εκτυπώστε κάποιο μήνυμα στην κονσόλα εάν η εξαίρεση έχει συλληφθεί.
  14. Άκρο του σώματος του μπλοκ αλίευσης.
  15. Το πρόγραμμα θα πρέπει να επιστρέψει μια τιμή μετά την επιτυχή εκτέλεση.
  16. Τέλος του σώματος της συνάρτησης main().

Παράδειγμα 2:

#include <iostream>
using 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;
}

Παραγωγή:

Λέξεις-κλειδιά χειρισμού εξαιρέσεων

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

Λέξεις-κλειδιά χειρισμού εξαιρέσεων

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμα για να χρησιμοποιήσετε τις λειτουργίες του.
  2. Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμα στις κλάσεις του χωρίς να τον καλέσετε.
  3. Δημιουργήστε μια συνάρτηση με το όνομα zeroDivision που παίρνει δύο ακέραια ορίσματα, x και y. Η συνάρτηση θα πρέπει να επιστρέφει διπλό αποτέλεσμα.
  4. Χρησιμοποιήστε μια δήλωση if για να ελέγξετε εάν η τιμή της μεταβλητής ορίσματος y είναι 0. Το { σηματοδοτεί την αρχή του σώματος if.
  5. Το μήνυμα που θα επιστραφεί/πεταχτεί εάν το y είναι 0.
  6. Τέλος του σώματος της δήλωσης if.
  7. Η συνάρτηση zeroDivision θα πρέπει να επιστρέψει την τιμή x/y.
  8. Τέλος του σώματος της συνάρτησης zeroDivision.
  9. Καλέστε τη μέθοδο main(). Το { σηματοδοτεί την αρχή αυτής της μεθόδου.
  10. Δηλώστε μια ακέραια μεταβλητή και ορίστε της την τιμή 11.
  11. Δηλώστε μια ακέραια μεταβλητή b και αποδίδοντάς της την τιμή 0.
  12. Δηλώστε μια διπλή μεταβλητή c και ορίστε της την τιμή 0.
  13. Χρησιμοποιήστε τη δήλωση try για να συλλάβετε μια εξαίρεση. Το { σηματοδοτεί την αρχή του σώματος του μπλοκ try/catch. Ο κωδικός που προστίθεται στο σώμα θα γίνει ο προστατευμένος κωδικός.
  14. Καλέστε τη συνάρτηση zeroDivision και μετάβαση στα ορίσματα a και b, δηλαδή 11 και 0. Το αποτέλεσμα αυτής της λειτουργίας θα αποθηκευτεί στη μεταβλητή c.
  15. Εκτυπώστε την τιμή της μεταβλητής c στην κονσόλα.
  16. Τέλος του σώματος του μπλοκ try/catch.
  17. Πιάσε την εξαίρεση. Το μήνυμα σφάλματος που επιστράφηκε θα αποθηκευτεί στο μήνυμα μεταβλητής.
  18. Εκτυπώστε το μήνυμα σφάλματος που επιστράφηκε στην κονσόλα.
  19. Άκρο του σώματος του μπλοκ αλίευσης.
  20. Το πρόγραμμα θα πρέπει να επιστρέψει μια τιμή μετά την επιτυχή εκτέλεση.
  21. Τέλος του σώματος της συνάρτησης main().

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::invalid_argument Μια εξαίρεση για τη χρήση μη έγκυρων ορισμών.
std::length_error Μια εξαίρεση μετά τη δημιουργία ενός μεγάλου std::string.
std::out_of_range Απορρίπτεται η μέθοδος.
std::runtime_error Αυτή είναι μια εξαίρεση που δεν μπορεί να εντοπιστεί μέσω της ανάγνωσης του κώδικα.
std::overflow_error Αυτή η εξαίρεση απορρίπτεται μετά την εμφάνιση μιας μαθηματικής υπερχείλισης.
std::range_error Αυτή η εξαίρεση εμφανίζεται όταν προσπαθείτε να αποθηκεύσετε μια τιμή εκτός εύρους.
std::underflow_error Μια εξαίρεση που έγινε μετά την εμφάνιση μαθηματικής υπορροής.

Εξαιρέσεις που καθορίζονται από το χρήστη

The C++ Η κλάση std::exception μας επιτρέπει να ορίσουμε αντικείμενα που μπορούν να τεθούν ως εξαιρέσεις. Αυτή η κλάση έχει οριστεί στο επί κεφαλής. Η κλάση μας παρέχει μια εικονική συνάρτηση μέλους που ονομάζεται what.

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

Παράδειγμα:

#include <iostream>
#include <exception>
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;	
}

Παραγωγή:

Εξαιρέσεις που καθορίζονται από το χρήστη

Εδώ είναι ένα στιγμιότυπο οθόνης του κώδικα:

Εξαιρέσεις που καθορίζονται από το χρήστη

Επεξήγηση κώδικα:

  1. Συμπεριλάβετε το αρχείο κεφαλίδας iostream στο πρόγραμμά μας. Θα χρησιμοποιήσουμε τις λειτουργίες του χωρίς να λάβουμε σφάλματα.
  2. Συμπεριλάβετε το αρχείο κεφαλίδας εξαίρεσης στο πρόγραμμά μας. Θα χρησιμοποιήσουμε τις λειτουργίες του όπως αυτό χωρίς σφάλματα.
  3. Συμπεριλάβετε τον χώρο ονομάτων std στο πρόγραμμά μας για να χρησιμοποιήσετε τις κλάσεις του χωρίς να τον καλέσετε.
  4. Δημιουργήστε μια νέα κλάση με το όνομα newException. Αυτή η κλάση κληρονομεί την κατηγορία εξαιρέσεων του C++.
  5. Η αρχή του σώματος της τάξης.
  6. Αντικαταστήστε τη συνάρτηση εικονικού μέλους what() που ορίζεται στο αρχείο κεφαλίδας εξαίρεσης. Στη συνέχεια θα περιγράψουμε τη δική μας εξαίρεση, τη νέα εξαίρεση.
  7. Ξεκινήστε τον ορισμό της νέας εξαίρεσης.
  8. Το μήνυμα που πρέπει να επιστραφεί εάν συλληφθεί η νέα εξαίρεση.
  9. Τέλος του ορισμού της νέας εξαίρεσης.
  10. Τέλος του σώματος της τάξης newException. Το newex είναι το όνομα που χρησιμοποιείται για να συλλάβει τη νέα μας εξαίρεση, μετά την οποία θα κληθεί η newException.
  11. Καλέστε τη συνάρτηση main(). Η λογική του προγράμματος πρέπει να προστεθεί στο σώμα του. Το { σηματοδοτεί την αρχή του σώματός του.
  12. Χρησιμοποιήστε μια δήλωση δοκιμής για να επισημάνετε τον κωδικό μέσα στον οποίο πρέπει να επισημάνουμε την εξαίρεση. Το { σηματοδοτεί την αρχή του σώματος του μπλοκ try/catch. Ο κωδικός που περιβάλλεται από αυτό θα προστατεύεται.
  13. Πετάξτε την εξαίρεση newex εάν πιαστεί.
  14. Τέλος του σώματος δοκιμής.
  15. Χρησιμοποιήστε τη δήλωση catch για να συλλάβετε την εξαίρεση. Το μήνυμα σφάλματος εξαίρεσης θα αποθηκευτεί στη μεταβλητή ex.
  16. Εκτυπώστε το μήνυμα σφάλματος εξαίρεσης στην κονσόλα.
  17. Τέλος του σώματος της δήλωσης αλιευμάτων.
  18. Το πρόγραμμα θα πρέπει να επιστρέψει μια τιμή εάν εκτελεστεί με επιτυχία.
  19. Τέλος του σώματος της συνάρτησης main().

Περίληψη

  • Με εξαίρεση χειρισμό σε C++, μπορείτε να χειριστείτε σφάλματα χρόνου εκτέλεσης.
  • Τα σφάλματα χρόνου εκτέλεσης είναι τα σφάλματα που εμφανίζονται κατά την εκτέλεση του προγράμματος.
  • Ο χειρισμός εξαιρέσεων σάς βοηθά να χειριστείτε τυχόν απροσδόκητες περιστάσεις στο πρόγραμμά σας.
  • Όταν συμβεί η απροσδόκητη περίσταση, ο έλεγχος του προγράμματος μεταφέρεται στους χειριστές.
  • Για να συλλάβετε μια εξαίρεση, τοποθετείτε μια ενότητα κώδικα κάτω από το μπλοκ try-catch.
  • Η λέξη-κλειδί ρίχνει βοηθά το πρόγραμμα να κάνει εξαιρέσεις, βοηθώντας το πρόγραμμα να χειριστεί το πρόβλημα.
  • Η λέξη-κλειδί try βοηθά στον προσδιορισμό του μπλοκ κώδικα για το οποίο θα ενεργοποιηθούν ορισμένες εξαιρέσεις.
  • Μπορούμε να αντικαταστήσουμε τη συνάρτηση what() του αρχείου κεφαλίδας εξαίρεσης για να ορίσουμε τις εξαιρέσεις μας.