Middle
Čím sa ukladajú výnimky v C++?
sobes.tech AI
Odpoveď od AI
S objektmi. Pri vyvolaní výnimky pomocou throw sa vytvorí dočasný objekt, ktorý sa následne odovzdá mechanizmu spracovania výnimiek. Typ tohto objektu určuje, ktorý catch handler bude vybraný.
Tu je príklad, ktorý ukazuje, ako sa výnimky ukladajú vo forme objektov:
#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) {
// Vyhodíme výnimku - objekt triedy MyException
throw MyException(-1);
}
if (val == 0) {
// Vyhodíme štandardnú výnimku - objekt triedy std::runtime_error
throw std::runtime_error("Hodnota nemôže byť nula.");
}
std::cout << "Hodnota je kladná: " << val << std::endl;
}
int main() {
try {
test_func(-5);
} catch (const MyException& e) {
// Zachytávame výnimku podľa typu objektu MyException
std::cerr << "MyException zachytená s kódom: " << e.get_code() << std::endl;
} catch (const std::runtime_error& e) {
// Zachytávame výnimku podľa typu objektu std::runtime_error
std::cerr << "std::runtime_error zachytená: " << e.what() << std::endl;
} catch (...) {
// Zachytávame akúkoľvek inú výnimku
std::cerr << "Neznáma výnimka zachytená." << std::endl;
}
try {
test_func(0);
} catch (const std::exception& e) {
// Môžeme zachytiť základnú triedu pre štandardné výnimky
std::cerr << "Štandardná výnimka zachytená: " << e.what() << std::endl;
}
return 0;
}