난 정말 최고야 멋있어
윈도우 예외 처리 본문
1. C++ 기본 예외 처리 try ~ catch
=> 윈도우에서 동작시 내부적으로 SEH 이용
어떤 타입이던지 throw 가능 (그래도 웬만하면 std::exception 이용하자)
받을때는 그 타입으로 받으면 된다!
2. SEH (Structured Exception Handling)
=> __try __except 문 또는 __try __finally문 을 이용해서 구현 가능
__except() 인자로 어떤 필터를 적용하느냐에 따라서 처리를 다르게 할 수 있음
필터값들은 excpt.h 에 정의 되어 있음
// Defined values for the exception filter expression
#define EXCEPTION_EXECUTE_HANDLER 1
#define EXCEPTION_CONTINUE_SEARCH 0
#define EXCEPTION_CONTINUE_EXECUTION (-1)
필터 함수를 만들어서 조건별로 다르게 필터값을 출력하도록 해도 됨..
Like this..
int ExceptionFilter(EXCEPTION_POINTERS* pException)
{
if (pException->ExceptionRecord->ExceptionCode = EXCEPTION_ACCESS_VIOLATION)
return EXCEPTION_EXECUTE_HANDLER;
else
return EXCEPTION_CONTINUE_SEARCH;
}
이용시에는
__try{
//sth try
}
__except(ExceptionFilter(GetExceptionInformation()))
{
//handling exception
}
참고로 EXCEPTION_POINTERS 구조체는 ExceptionRecord 와 ContextRecord 를 가지고 있는데 상당히 유용하다
+ 또는 SetUnhandledExceptionFilter 를 이용하여 SEH 에 등록 할 수도 있다.
모두 SEH 를 이용한다는 것은 같지만, 대신 실행 순서가 약간 다르다
3.VEH (Vectored Exception Handling)
AddVectoredExceptionHandler(true, (PVECTORED_EXCEPTION_HANDLER)vehHandler);
AddVectoredContinueHandler(true, (PVECTORED_EXCEPTION_HANDLER)continueHandler);
//todo;
RemoveVectoredContinueHandler(continueHandler);
RemoveVectoredExceptionHandler(vehHandler);
vehHandler 와 continueHandler는 SEH 의 필터 함수처럼 만들어 주면 된다..
4.예외 처리 순서
1. DBG_CONTINUE
2. VEH
3. SEH (__try ~ ...)
4. SEH (SetUnhandledExceptionFilter)
5. DBG_CONTINUE
6. csrss.exe => 에러 문구 출력