Skip to content

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;
}
Clone this wiki locally