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