[뇌를 자극하는 윈도우즈 시스템 프로그래밍] 17장 구조적 예외처리(SEH) 기법
예외와 에러
예외와 에러를 같은 의미로 말하는 사람도 있지만 보통 프로그래밍에서 예외는 프로그램 실행 중 발생 가능한 상황을 의미하며, 에러는 복구 불가능한 중대한 문제를 의미한다.
catch해서 처리할 수 있다면 예외라고 볼 수 있다.
예외는 hardware excetpion과 software exception이 있다.
예외를 감지하는 주체에 따라 나뉜다.
프로그램에서 하드웨어 예외는 SEH, 소프트웨어 예외는 표준 c++예외 처리를 통해 확인할 수 있따.
Termination Handler
종료 핸들러에서는 try, finally 키워드를 사용한다.
try문을 진입했다면 컴파일러 차원에서 반드시 이하의 finally문이 실행되는 것을 보장한다.
try문 내에서 빠져나오게 되는 경우 (정상 진행, return, 예외, 에러 등) 실행된다.
따라서 반드시 실행되어야 하는 코드(resource 반환 등)를 실행할 수 있다.
Exception Handler
위의 종료 핸들러와는 다르게 이 경우는 Exception이 발생한 경우에 실행되는 구문이다.
except문을 사용하면 try문 내에서 예외상황이 발생했을 때 OS가 except문으로 실행 흐름을 옮겨준다.
GetExceptionCode를 호출하면 발생한 예외 정보 값을 확인할 수 있다.
https://learn.microsoft.com/ko-kr/windows/win32/debug/getexceptioncode
GetExceptionCode 매크로 - Win32 apps
발생하는 예외 형식을 식별하는 코드를 검색합니다. 이 함수는 필터 식 또는 예외 처리기의 예외 처리기 블록 내에서만 호출할 수 있습니다.
learn.microsoft.com
예외 처리기는 3가지 필터 옵션을 사용할 수 있다.
EXCEPTION_CONTINUE_SEARCH: 예외를 인식하지 못하고 다른 처리기에 제어 전달
EXCEPTION_CONTINUE_EXECUTION: 예외를 인식하지만 해제
EXCEPTION_EXECUTE_HANDLER: 예외를 인식하고 처리
https://learn.microsoft.com/ko-kr/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170
Structured Exception Handling (C/C++)
Microsoft C/C++의 구조화된 예외 처리 개요.
learn.microsoft.com
MS에서는 대부분의 경우 SEH대신 ISO표준 C++예외 처리를 사용하는 것이 좋다고 얘기한다.
소프트웨어 기반 개발자 정의 exception
하드웨어 예외는 하드웨어에 의해 이미 정해져있지만 소프트웨어 예외는 개발자가 결정할 수 있다.
https://learn.microsoft.com/ko-kr/windows/win32/api/errhandlingapi/nf-errhandlingapi-raiseexception
RaiseException 함수(errhandlingapi.h) - Win32 apps
호출 스레드에서 예외를 발생시킵니다.
learn.microsoft.com
RaiseException함수를 사용하면 사용자 정의 exception을 등록할 수 있다.
책에 SEH이점에 공감이 가지 않는다면 잘 이해가 가지 않을 수 있다고 하는데
내가 그런 것 같다.
MS에서도 일반적인 try catch구문을 사용하라고 하니..
나중에 더 알게 되는 날이 오면 수정하겠다.