예외 핸들링은 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/

 

단순 요약


1. API는 C 프로그래밍에서 사용 된다.

2. MFC는 C++ 프로그래밍에서 사용 된다.

즉,  MFC는 API와 같은 것이나 객체 지향 개념이 도입된 C++에서 API를 기능별로 클래스화 한 형태로 만든 것이다.

 

MFC


Microsoft Foundation Class의 약자로 마이크로소프트에서 만든 클래스이다.

 

C++ 언어를 사용하는 경우 API 함수들이 모두 C 형태로 제공되기 때문에 C++의 특징인 객체지향의 형식에도 맞도록 재구성의 필요성이 증대했다. 이에 Microsoft에서 C++ 개발자를 위해 API 함수와 API 함수가 사용하는 구조체들을 모아서 클래스를 만들어 놓았는데 이 클래스의 집합을 MFC라 한다. 

 

MFC의 시초는 AFX(Application Framework)에서 유래되었다 할 수 있다. AFX는 1990년 마이크로소프트가 윈도우 API 함수를 캡슐화하여 만든 라이브러리이다. AFX는 MFC의 전 단계로, 수정을 거쳐서 지금의 MFC가 완성된 것이다. 1993년 이후부터 MFC 라이브러리는 Visual C++에 포함되어 제공되고 있다.

 

 

MFC의 특징


  • 객체 지향 프로그래밍
    • C++의 모든 문법이나 특성을 그대로 이어 받는다.
    • 윈도우의 Object를 포함하는 시각적 객체를 사용한다.

 

  • 이벤트 처리방식
    • 사용자 또는 시스템이 윈도우에 어떤 동작을 했을 경우 그에 대응하여 움직이는 사건의 중심을 프로그램이라 하며 이것을 Event Driven Programming이라 한다.

 

  • 메세지 처리방식
    • 윈도우 이벤트가 발생했을 경우 해당 이벤트를 메세지를 통해 알려주고 그 메시지를 받아서 그에 따른 Output을 한다. 이를 Message Driven Programming이라 한다.

 

MFC의 장점


  • 프로그램 개발 시간을 크게 단축시킨다. 기존의 Win32 API를 이용할 때, 개발자가 직접하던 많은 실행 함수에 대한 번거로움을 개선한다.
  • 객체지향을 이용하여 C++ 프로그래밍을 하면서도 Win32 API 함수를 그대로 사용할 수 있다.
  • 동적 메모리 할당 영역 검증 및 관리, 디버깅 등의 기능을 활용해 버그가 적은 안전한 프로그램을 작성할 수 있다.
  • 다른 운영체제로 이식성이 좋다. MFC로 작성된 프로그램을 매킨토시나 유닉스 버전으로 포팅할 수 있다.
  • 개발자로 하여금 손쉬운 GUI 기반 프로그램 제작 환경을 만들어 준다.

 

MFC의 계층도


기본적으로 MFC 프로젝트를 생성하면 위와 같은 구조도로 이루어져 있으며, 위와 같은 계층 구조에서 크게 벗어나지 않는 범위 내에서 파생 클래스로 모든 클래스를 상속 받아서 만들어지게 된다.

따라서 A부터 Z까지 모든 것을 프로그래머가 프로그래밍을 하는 것이 아니라, 공통적인 부분은 MFC 클래스에서 제공하는 기능을 그대로 이용하고, 고유한 기능만 프로그래머가 커스터마이징하여 넣어주면 되기에 프로그래머 입장에서 손쉽게 코딩할 수 있다.

 

Reference


[1] https://yyman.tistory.com/490

[2] https://coding-factory.tistory.com/141

'Interest > 기타' 카테고리의 다른 글

[Windows Programming] main, wmain, _tmain  (0) 2020.03.18
[C/C++] 예외 핸들링(Exception Handling)  (0) 2020.03.18
[Windows Programming] API와 SDK  (0) 2020.03.18
[Windows Programming] HWND, HINSTANCE, HDC  (0) 2020.03.18
VI 기능 단축키  (0) 2020.03.18

+ Recent posts