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