예외 핸들링은 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/
'Interest > 기타' 카테고리의 다른 글
fatal error C1189: #error: "No Target Architecture" (0) | 2020.03.18 |
---|---|
[Windows Programming] main, wmain, _tmain (0) | 2020.03.18 |
[Windows Programming] API와 MFC의 차이 (2) | 2020.03.18 |
[Windows Programming] API와 SDK (0) | 2020.03.18 |
[Windows Programming] HWND, HINSTANCE, HDC (0) | 2020.03.18 |