Junior
Τι είναι οι εξαιρέσεις σε C++;
sobes.tech AI
Απάντηση από AI
Μηχανισμός διαχείρισης ανωμαλιών καταστάσεων (σφαλμάτων) που προκύπτουν κατά την εκτέλεση του προγράμματος. Επιτρέπει τον διαχωρισμό του κώδικα που είναι υπεύθυνος για τη λογική του προγράμματος από τον κώδικα διαχείρισης σφαλμάτων.
Λέξεις-κλειδιά:
try: Ορίζει ένα μπλοκ κώδικα όπου μπορούν να προκύψουν εξαιρέσεις.catch: Ορίζει ένα μπλοκ κώδικα που εκτελείται όταν προκύψει ένας συγκεκριμένος τύπος εξαίρεσης.throw: Δημιουργεί (γεννά) μια εξαίρεση. Ο τύπος της εξαίρεσης μπορεί να είναι οποιοδήποτε αντικείμενο.
Αρχή λειτουργίας:
- Ο κώδικας που μπορεί να προκαλέσει σφάλμα τοποθετείται στο μπλοκ
try. - Αν στο μπλοκ
tryπροκύψει εξαίρεση (που δημιουργείται μεthrow), η κανονική εκτέλεση του προγράμματος διακόπτεται. - Το σύστημα αναζητά ένα κατάλληλο μπλοκ
catchπου μπορεί να χειριστεί την εξαίρεση που δημιουργήθηκε (ανά τύπο). - Αν βρεθεί ένα κατάλληλο
catch, ο κώδικας του εκτελείται. - Αν δεν βρεθεί κατάλληλο
catchστο τρέχον επίπεδο κλήσεων, η εξαίρεση "διαχέεται" προς τα πάνω στη στοίβα κλήσεων μέχρι να βρεθεί μια κατάλληλη λειτουργία χειρισμού (ή το πρόγραμμα τερματίζει λανθασμένα).
Παράδειγμα:
#include <iostream>
#include <stdexcept> // Για τυπικούς τύπους εξαιρέσεων
int divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Διαίρεση με το μηδέν!"); // Δημιουργία εξαίρεσης
}
return a / b;
}
int main() {
try {
int result = divide(10, 0); // Κλήση λειτουργίας που μπορεί να ρίξει εξαίρεση
std::cout << "Αποτέλεσμα: " << result << std::endl; // Αυτή η γραμμή δεν θα εκτελεστεί
} catch (const std::runtime_error& e) { // Πιάσιμο εξαίρεσης τύπου std::runtime_error
std::cerr << "Σφάλμα: " << e.what() << std::endl; // Επεξεργασία εξαίρεσης
} catch (...) { // Πιάσιμο οποιασδήποτε άλλης εξαίρεσης
std::cerr << "Προέκυψε άγνωστο σφάλμα." << std::endl;
}
std::cout << "Το πρόγραμμα συνεχίζεται μετά την επεξεργασία σφάλματος." << std::endl;
return 0;
}
Πλεονεκτήματα:
- Διαχωρισμός λογικής και διαχείρισης σφαλμάτων.
- Απλοποίηση του κύριου ρεύματος του κώδικα.
- Δυνατότητα διαχείρισης σφαλμάτων σε διαφορετικά επίπεδα ιεραρχίας κλήσεων.
Μειονεκτήματα:
- Μπορεί να επηρεάσει την απόδοση (λόγω διασποράς στοίβας).
- Δύσκολη κατανόηση της ροής εκτέλεσης με πολλαπλές εξαιρέσεις.
- Κακή χρήση μπορεί να οδηγήσει σε διαρροές πόρων (αν οι πόροι δεν απελευθερώνονται σωστά όταν προκύψει εξαίρεση πριν από την απελευθέρωσή τους).
Για ασφαλή εργασία με πόρους σε παρουσία εξαιρέσεων, συχνά χρησιμοποιούνται RAII (Resource Acquisition Is Initialization) και έξυπνοι δείκτες.