Middle
Czym są przechowywane wyjątki w C++?
sobes.tech AI
Odpowiedź od AI
Z obiektami. Podczas rzucania wyjątku za pomocą throw tworzony jest tymczasowy obiekt, który następnie jest przekazywany do mechanizmu obsługi wyjątków. Typ tego obiektu decyduje, który obsługiwacz catch zostanie wybrany.
Oto przykład demonstrujący przechowywanie wyjątków w formie obiektów:
#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) {
// Rzucamy wyjątek - obiekt klasy MyException
throw MyException(-1);
}
if (val == 0) {
// Rzucamy standardowy wyjątek - obiekt klasy std::runtime_error
throw std::runtime_error("Wartość nie może być zero.");
}
std::cout << "Wartość jest dodatnia: " << val << std::endl;
}
int main() {
try {
test_func(-5);
} catch (const MyException& e) {
// Przechwytujemy wyjątek według typu obiektu MyException
std::cerr << "Przechwycono MyException z kodem: " << e.get_code() << std::endl;
} catch (const std::runtime_error& e) {
// Przechwytujemy wyjątek według typu obiektu std::runtime_error
std::cerr << "Przechwycono std::runtime_error: " << e.what() << std::endl;
} catch (...) {
// Przechwytujemy dowolny inny wyjątek
std::cerr << "Przechwycono nieznany wyjątek." << std::endl;
}
try {
test_func(0);
} catch (const std::exception& e) {
// Można przechwycić klasę bazową dla standardowych wyjątków
std::cerr << "Przechwycono wyjątek standardowy: " << e.what() << std::endl;
}
return 0;
}