예외 핸들링은 Memory Fault와 같은 Critical한 Exception을 핸들링하기 위함이며 또한 디버깅에 도움을 주기 위함이다. Windows에서 C/C++로 개발을 할 때 예외를 핸들링할 수 있는 방법은 크게 세가지가 있다.

 

1. __try ~ __except


Windows OS에서 제공하는 예외 처리 방법이며, 일반적으로 SEH(Structured Error Handling)이라 부른다. Access Viloation과 같이 프로그램 상의 오류로 인해 발생하는 대부분의 예외를 처리 가능하다. 관련 키워드는 __try, __except, __finally, __leave가 있다.

 

__except의 부분의 상수는 크게 세 가지가 존재한다

  • EXCEPTION_EXECUTE_HANDLER
    • 예외 처리 루틴을 실행하라는 의미며, 여기서 의미하는 예외 처리 루틴은 __except 블록 내의 코드를 의미한다.

 

  • EXCEPTION_CONTINUE_SEARCH
    • try ~ catch에서 예외를 던지는 것과 같은 효과이다. 즉, 바깥 함수에 다시 __try ~ 구문이 기다리고 있지 않다면 프로그램은 예외를 내게 된다.

 

  • EXCEPTION_CONTINUE_EXECUTION
    • 예외가 발생한 라인부터 다시 실행을 시도한다. 만약 예외가 해결되지 않은 상황에서 다시 실행을 할 경우 무한루프가 발생한다.

 

1.1 장점

- 구조화된 예외처리를 수행하기 때문에 코드가 깔끔해진다.

 

 

1.1 단점

- __try ~ __except 구문의 가장 큰 단점은 소멸자가 존재하는 클래스와 함께 사용할 수 없다는 점이다.

- 소멸자가 정의된 클래스의 인스턴스를 __try 블록 안에서 생성하게 되면 컴파일 에러가 발생한다.

- try ~ catch 구문과 함께 사용할 수 없다.

 

2. try ~ catch


표준 C++에서 제공하는 예외 처리 방법이며, 일반적으로 C++ Error Handling이라 부른다. try ~ catch 구문은 throw 키워드를 이용해 코드상에서 명시적으로 발생시킨 예외를 핸들링한다. try ~ catch 구문은 내부적으로는 __try ~ __except의 예외처리 구조(SEH)를 기반으로 구현되어 있다. catch에서 일치하는 데이터 타입이 없어 예외가 핸들링 되지 않으면, 프로그램은 최종적으로 예외를 발생시키고 비정상 종료된다. (관련 키워드 : try, catch, throw)

 

3. Unhandled Exception Filter


앞서 1,2번인 SEH나 C++ 예외 핸들링에 의해 핸들링되지 않은 예외를 최종적으로 핸들링할 수 있는 Callback 함수를 등록하는 방법이다.

 

 

4. Reference


[1] https://kuaaan.tistory.com/435

[2] https://kuaaan.tistory.com/103

[3] https://elky84.github.io/2011/08/24/exception_handling_in_cpp/

 

+ Recent posts