본문 바로가기

분류대기

Window, C++, 예외처리

[1. 개요]

윈도우 환경에서 C++ 애플리케이션 작성 시, 예외처리 방법을 정리한다.

  • try ~ catch
  • __try ~ __except (SEH)
  • Unhandled Exception Filter

[2. try ~ catch]

  • 표준 C++ 에서 제공하는 예외 처리 방법
  • throw 키워드를 이용해 명시적으로 발생시킨 예외를 제어한다.
  • catch 에서 예외를 전부 제어할 수 없는 경우, 비정상 종료가 발생한다.

 

[3. __try ~ __except]

  • 윈도우 에서 제공하는 예외 처리 방법
    # 리눅스에서는 사용 불가 (?)
  • SEH (=Structured Error Handling) 이라고 부른다.

[4. Unhandled Exception Filter]


[5. GetExceptionCode() ]


[6. GetExceptionInformation() ]

  • exception 이 발생한 thread 에 대해서 부가적인 상태등을 확인한다.
  • 반환하는 구조체의 형태( =EXCEPTION_POINTER) 는 아래와 같다.
    • EXCEPTION_RECORD
    • CONTEXT_RECORD

 

CONTEXT_RECORD

  • exception 이 발생했을 때 프로세서의 상태를 포함한다.
  • 프로세서 레지스터 값.
    # 범용 레지스터
    => eax, ebx, ecx, edx

    # 스택 관련
    => ebp, esp

    # 인덱스 관련
    => esi, edi

EXCEPTION_RECORD

  • machine 에 관계 없는 exception 의 description 을 포함한다.
  • ExceptionCode
    # GetExceptionCode() 와 같음

  • ExceptionFlags
    # 흔하게 볼 수 있는 exception flag 는 아래와 같다.
    # EXCEPTION_NONCONTINUABLE => 이번에 발생한 exception 은 더 이상 진행할 수 없는 exception 을 의미한다.
    # EXCEPTION_SOFTWARE_ORIGINATE => system 사용을 위해 예약된 값

  • ExceptionAddress
    # exception 이 발생한 주소
    # 주소를 포함하는 함수를 찾는 방법은 추후 정리하도록 한다.

  • NumberParameter
    # exception 과 연간된 parameter 의 개수
    # tionInformation 배열의 길이이다.

  • ExceptionInformation
    # 대부분의 exception code 에 대해서 배열 내 값은 undefine 되어 있음.
    # EXCEPTION_ACCESS_VIOLATION
    # EXCEPTION_IN_PAGE_ERROR

  • *ExceptionRecord
    # 중첩된 exception 이 발생했을 때, 다음 ExceptionRecord

 

[.. 참고자료]