Sobes.tech
Middle

Με τι αποθηκεύονται οι εξαιρέσεις σε C++;

sobes.tech AI

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

Με αντικείμενα. Όταν ρίχνετε μια εξαίρεση με throw, δημιουργείται ένα προσωρινό αντικείμενο που στη συνέχεια περνάει στον μηχανισμό διαχείρισης εξαιρέσεων. Ο τύπος αυτού του αντικειμένου καθορίζει ποιος χειριστής catch θα επιλεγεί.

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

#include <iostream>
#include <stdexcept>

class MyException {
    int error_code;
public:
    MyException(int code) : error_code(code) {}
    int get_code() const { return error_code; }
};

void test_func(int val) {
    if (val < 0) {
        // Ρίχνουμε μια εξαίρεση - αντικείμενο της κλάσης MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Ρίχνουμε μια τυπική εξαίρεση - αντικείμενο της κλάσης std::runtime_error
        throw std::runtime_error("Η τιμή δεν μπορεί να είναι μηδέν.");
    }
    std::cout << "Η τιμή είναι θετική: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Πιάνουμε την εξαίρεση κατά τον τύπο του αντικειμένου MyException
        std::cerr << "Πιάστηκε MyException με κωδικό: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Πιάνουμε την εξαίρεση κατά τον τύπο του αντικειμένου std::runtime_error
        std::cerr << "Πιάστηκε std::runtime_error: " << e.what() << std::endl;
    } catch (...) {
        // Πιάνουμε οποιαδήποτε άλλη εξαίρεση
        std::cerr << "Άγνωστη εξαίρεση πιάστηκε." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Μπορούμε να πιάσουμε την βασική κλάση για τυπικές εξαιρέσεις
        std::cerr << "Τυπική εξαίρεση πιάστηκε: " << e.what() << std::endl;
    }

    return 0;
}