-
Notifications
You must be signed in to change notification settings - Fork 2
2014 06 25 중첩된 예외
krikit edited this page Nov 26, 2014
·
1 revision
예외(exception)가 발생하여 처리하는 도중 다시 예외를 발생해야 하는 경우도 있습니다. 이렇게 이중으로 예외가 발생할 경우 새로운 예외를 발생하면서 기존에 처리하던 예외 정보는 잃어버릴 수도 있습니다. C++11에서는 이러한 문제를 해결하기 위해 std::nested_exception을 통해 중첩된 예외 메카니즘을 제공합니다.
class MyExcept : public std::exception, public std::nested_exception {
public:
MyExcept(const char* msg) : _msg(msg) {}
virtual ~MyExcept() noexcept {}
virtual const char* what() const noexcept { return _msg.c_str(); }
private:
std::string _msg;
};
void throw_something() {
try {
throw std::runtime_error("1st error"); // 첫번째 예외 발생
} catch (const std::runtime_error& run_err) {
std::throw_with_nested(MyExcept("2nd exception")); // 두번째 중첩된 예외 발생
}
}
int main(int argc, char** argv) {
try {
throw_something();
} catch (const MyExcept& my_exc) {
// 두번째 예외를 먼저 처리하거나,
try {
std::rethrow_if_nested(my_exc);
} catch (const std::runtime_error& run_err) {
// 첫번째 예외 처리
std::cerr << run_err.what() << std::endl;
}
// 두번째 예외를 나중에 처리
std::cerr << my_exc.what() << std::endl;
}
return 0;
}