※ 아래는 윤성우 뇌를 자극하는 윈도우즈 프로그래밍 한빛미디어(주) 2022년
Chapter17(p.531 ~ 581)를 읽고 정리한 내용입니다.
(1) 종료 핸들러(Termination Handler) : __try __finally
-> __try 블록을 한 줄이라도 실행하게 되면 반드시 __finally 블록을 실행해라
-> __try 블록을 빠져나오게 하는 대표적인 상황 : return, continue, break, goto, 예외
-> ExitProcess, ExitThread, ANSI C 라이브러리의 exit 함수에 의한 프로세스 또는
쓰레드의 강제 종료는 __finally 블록의 실행으로 이어지지 않음
예외 핸들러(Exception Handler) : __try, __except
-> 중복 가능(종료 핸들러와도 중복 가능)
-> __except(예외처리 방식)
-> 예외처리 방식이라고 쓰여진 부분은 예외필터로, 인자전달을 위해 지정된 영역은 아니다.
-> 이 곳에는 세 가지 필터 표현식이 올 수 있다.
예외 핸들러 종류
(1) EXCEPTION_EXECUTE_HANDLER
: __try 블록의 나머지 부분(예외상황이 발생한 라인 이후)을 건너 뜀
예외를 처리하면 프로그램이 강제 종료되지 않음
(2) EXCEPTION_CONTINUE_EXECUTION
: __except 블록의 내부를 실행하지 않고 예외가 발생한 위치로 이동하여 실행을 이어나감
(3) EXCEPTION_CONTINUE_SEARCH
: 함수가 호출된 순서를 바탕으로 예외 핸들러를 찾게 됨
예외가 발생된 함수를 호출한 영역이 _tmain의 특정 함수면 해당 함수가 있는 위치에서
예외 핸들러를 찾음 (except 부분)
-> 예외가 처리되어야 하는 위치를 별도로 지정하기 위한 용도로 사용됨
(참고)
(1)정의되어 있는 예외의 종류를 구분하는 방법
GetExceptionCode 함수 사용
-> 해당 함수는 __except 블록 안이나 예외필터 표현식을 지정하는 위치에서만 호출 가능함
(2) 소프트웨어 예외를 추가하는 방법
RaiseException 함수 사용
void RaiseException(dwExceptionCode, // 발생시킬 예외의 형태 지정
dwExceptionFlags, // 예외발생 이후의 실행방식에 제한을 둘 때 사용
nNumberOfArguments, // 추가 정보의 개수 지정
lpArguments) // 추가 정보 전달

31, 30번째 비트 : 00(성공), 01(예외알림), 10(경고), 11(강도 높은 오류 상황)
29번째 비트 : 예외를 정의한 주체 0(마이크로소프트 정의), 1(일반 개발자 정의)
28번째 비트 : 0
16~27번째 비트 : 예외발생 환경 정보

0~15번째 비트 : 예외 종류 구분
(3) GetExceptionCode 함수보다 많은 정보를 얻는 방법
GetExceptionInformation 함수 사용
-> 예외필터 표현식을 지정하는 부분에서만 호출 가능