Sobes.tech
Junior

Τι είναι οι εξαιρέσεις σε C++;

sobes.tech AI

Απάντηση από AI

Μηχανισμός διαχείρισης ανωμαλιών καταστάσεων (σφαλμάτων) που προκύπτουν κατά την εκτέλεση του προγράμματος. Επιτρέπει τον διαχωρισμό του κώδικα που είναι υπεύθυνος για τη λογική του προγράμματος από τον κώδικα διαχείρισης σφαλμάτων.

Λέξεις-κλειδιά:

  • try: Ορίζει ένα μπλοκ κώδικα όπου μπορούν να προκύψουν εξαιρέσεις.
  • catch: Ορίζει ένα μπλοκ κώδικα που εκτελείται όταν προκύψει ένας συγκεκριμένος τύπος εξαίρεσης.
  • throw: Δημιουργεί (γεννά) μια εξαίρεση. Ο τύπος της εξαίρεσης μπορεί να είναι οποιοδήποτε αντικείμενο.

Αρχή λειτουργίας:

  1. Ο κώδικας που μπορεί να προκαλέσει σφάλμα τοποθετείται στο μπλοκ try.
  2. Αν στο μπλοκ try προκύψει εξαίρεση (που δημιουργείται με throw), η κανονική εκτέλεση του προγράμματος διακόπτεται.
  3. Το σύστημα αναζητά ένα κατάλληλο μπλοκ catch που μπορεί να χειριστεί την εξαίρεση που δημιουργήθηκε (ανά τύπο).
  4. Αν βρεθεί ένα κατάλληλο catch, ο κώδικας του εκτελείται.
  5. Αν δεν βρεθεί κατάλληλο 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) και έξυπνοι δείκτες.