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

⚡ Έξυπνη Σύνοψη

Εξαίρεση χειρισμός σε C++ Επιτρέπει σε ένα πρόγραμμα να εντοπίζει και να ανταποκρίνεται σε σφάλματα χρόνου εκτέλεσης χρησιμοποιώντας τις εντολές try, catch και throw, ώστε να μην παρουσιάζει σφάλματα. Εδώ θα μάθετε τις λέξεις-κλειδιά, τη σύνταξη, τις τυπικές εξαιρέσεις και τις εξαιρέσεις που ορίζονται από τον χρήστη με παραδείγματα.

  • ⚠️ Αυτό που είναι: Ο χειρισμός εξαιρέσεων εντοπίζει σφάλματα χρόνου εκτέλεσης, ώστε ένα πρόγραμμα να μπορεί να ανακάμψει.
  • 🔑 Λέξεις-κλειδιά: Χρησιμοποιεί try για να δοκιμάσει τον κώδικα, throw για raise και catch για να χειριστεί σφάλματα.
  • 🧾 Σύνταξη: Τοποθετήστε επικίνδυνο κώδικα σε ένα μπλοκ try και χειριστείτε σφάλματα σε μπλοκ catch.
  • 📚 Τυπικές εξαιρέσεις: C++ παρέχει ενσωματωμένες εξαιρέσεις στην κεφαλίδα εξαιρέσεων.
  • 🤖 Βοήθεια με την Τεχνητή Νοημοσύνη: Τα εργαλεία τεχνητής νοημοσύνης όπως το GitHub Copilot προσθέτουν μπλοκ try-catch και χειρισμό σφαλμάτων.

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;
}

Παραγωγή:

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

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

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

Code Επεξήγηση:

  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;
}

Παραγωγή:

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

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

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

Code Επεξήγηση:

  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;	
}

Παραγωγή:

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

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

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

Code Επεξήγηση:

  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, throw και catch, ώστε το πρόγραμμα να μπορεί να ανακάμψει αντί να καταρρεύσει.

C++ Χρησιμοποιεί τρεις λέξεις-κλειδιά: η εντολή try αναδιπλώνει κώδικα που μπορεί να αποτύχει, η εντολή throw δημιουργεί μια εξαίρεση όταν παρουσιάζεται σφάλμα και η εντολή catch χειρίζεται την εξαίρεση που ρίχνεται.

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

Οι τυπικές εξαιρέσεις είναι ενσωματωμένες κλάσεις εξαιρέσεων στην κεφαλίδα εξαιρέσεων, όπως οι std::bad_alloc και std::out_of_range, οι οποίες αναφέρουν συνηθισμένα σφάλματα χρόνου εκτέλεσης.

Μια εξαίρεση που ορίζεται από τον χρήστη είναι μια προσαρμοσμένη κλάση, που συχνά προέρχεται από την std::exception, η οποία παρακάμπτει τη συνάρτηση what() για να περιγράψει τη δική σας συγκεκριμένη συνθήκη σφάλματος.

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

Ναι. Τα εργαλεία με τεχνητή νοημοσύνη εντοπίζουν μη επεξεργασμένες εξαιρέσεις, προτείνουν συγκεκριμένα μπλοκ catch αντί για γενικά και προσθέτουν ουσιαστικά μηνύματα σφάλματος, καθιστώντας το C++ κώδικας πιο ανθεκτικός.

Η εντολή throw δημιουργεί μια εξαίρεση όταν εντοπιστεί ένα σφάλμα, ενώ η εντολή catch λαμβάνει αυτήν την εξαίρεση και εκτελεί τον κώδικα που χειρίζεται ή αναφέρει το σφάλμα.

Συνοψίστε αυτήν την ανάρτηση με: