SEH로 몇 가지 실험을하고있었습니다. 내 코드에서 __try 절의 블록과 __except()의 핸들러 오류를 작성했습니다.SEH (구조적 예외 처리)를 사용할 때 다른 동작이 발생했습니다.
__try{
Test *pTest = 0;
int k = pTest->GetValue();
cout << "continue after exception" << endl;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION,EXCEPTION_EXECUTE_HANDLER)
{
cout << "caught!!" << endl;
}
cout << "Exception handled" << endl;
두번째 파라미터 __except하는()는 다음 중 어느 하나 인 -
EXCEPTION_CONTINUE_SEARCH 예외가 인식되지 않는다. 먼저 try-except 문을 포함하는 핸들러를 검색 한 다음 우선 순위가 높은 핸들러를 검색합니다.
EXCEPTION_CONTINUE_EXECUTION 예외는 인식되지만 무시됩니다. 예외가 발생한 지점에서 계속 실행하십시오.
EXCEPTION_EXECUTE_HANDLER 예외가 인식됩니다. __except 복합 문을 실행하여 예외 처리기로 제어를 전송 한 다음 예외가 발생한 지점에서 실행을 계속합니다.
EXCEPTION_CONTINUE_EXECUTION/EXCEPTION_EXECUTE_HANDLER를 사용할 때 예외 발생 지점에서 계속 실행되지 않습니다 (예외 발생 지점의 의미를 잘못 해석하고있는 것일 수 있음). 내가 디버그 모드에서 실행하면 내가 릴리스 모드에서 실행하면 는, 출력이
caught
Exception handled
이며, 출력은 다르게 행동하는 이유를 나는 이해할 수 없었다
continue after exception
Exception handled
입니다. 누구든지 도와주세요.
GetValue() 메소드의 내용보기 – ixSci
'Test'의 정의를 보여주고 SEH와 C++ 예외와 관련하여 디버그 옵션과 릴리즈 옵션이 어떻게 다른지 보여줍니다. 옵션이 있습니다. 또는 release 모드에서'__try {}'블록의 디스 어셈블리를 더 잘 보여줍니다. 그것은 더 나은 단서가있을 수 있습니다. –
''pTest'는 클래스에 대한 포인터이며'GetValue()'를 실행하기 위해 역 참조 할 필요가 없으며 컴파일러는 최적화가 릴리스 모드에서 활성화되면이를 인식합니다. 아니면 GetValue()를 쓸모없는 것으로 간주하고 호출 할 코드를 생성하지 않습니다. 또한 컴파일러가 NULL 포인터를 역 참조하면 정의되지 않은 동작이 발생하고 컴파일 타임에 코드를 조작하여이를 처벌하기로 결정할 수도 있습니다. 모든 권한이 있습니다. 'gcc'는 그것을하는 것으로 악명 높다. –