2011-02-19 5 views
0

첫째, C++에서 uncatchable 예외 같은 것이 있습니까?Uncatchable 예외?

하나의 DLL에서 throw 된 예외를 다른 DLL에서 발견 할 수없는 2005 Microsoft kb article을 보았습니다. 몇 년 전에 핫픽스로 해결되었지만 Visual C++ 2008에서이 문제가 발생했을 수 있습니다.

특히 충돌 후 미니 덤프 파일 보고서를 기반으로하기 때문에 :: fgetpos I '이보고 M :

kernel32!UnhandledExceptionFilter+0x55b

두 가지가 내 머리에 팝업. 먼저 호출 DLL과 별도의 DLL에있는 지정된 catch 블록이 예외를 캡처하지 못했음을 확인합니다. 이 KB 기사에서 설명하는 내용이 반복되어 있습니까? 둘째, kernel32 "처리되지 않은 예외"가 Visual C++ catch 블록이 catch 할 수없는 것이 아닌지 궁금합니다. 나는 "캐치 올 (catch-all)"elipses를 사용하는 것이 충분했을 것이라고 생각했다.

내가 누락 된 자료가 있습니까?

+0

던져진 예외는 무엇입니까? 또한 C++ 또는 SEH 예외 핸들러를 사용하고 있습니까? UnhandledExceptionFilter는 예외 처리기가 예외를 처리하지 않은 경우 처리하지만 예외는 코드에서 처리 할 수 ​​있습니다. – Avilo

답변

10

Visual C++ catch 블록은 C++ 예외 만 catch 할 수 있습니다. kernel32!UnhandlesExceptionFilter은 전체 SEH 예외 범위에 불과하며 C++ 예외를 훨씬 능가합니다. 간단한 소개를 위해이 기사는 여전히 신선하고 정확합니다. A Crash Course on the Depths of Win32™ Structured Exception Handling.

우리가 여기있는 동안 /EHa과 가능하면 _set_se_translator도 포함해야합니다. 그리고 물론, 모호한 __try/__exception SEH C++ MSVC 확장.

4

C++ 예외와 SEH 예외를 구별해야합니다. 커널은 C++ 예외에 대해 아무것도 모르고 있으며, C++ catch()는 SEH에 대해 (확장 된 catch 처리가 활성화되어 있지 않으면) 아무 것도 모릅니다. SEH 예외는 블록 _try 및 _finally로 catch됩니다. 그것들은 매우 다르며, 결코 그들을 섞어서는 안됩니다.