代码如下: /************************************************************************************* 程序作用: 测试异常 程序原理: 用异常关键字捕获异常,实践证明,只要在winmain里面布置捕获语句, 可以捕获到窗口消息回调函数里面的异常! 程序作者: 代码日期: 修改日期: 2011-01-16 *************************************************************************************/ #include <excpt.h> #include <windows.h> #include <iostream> using namespace std; /* struct: typedef struct _EXCEPTION_RECORD { DWORD ExceptionCode; DWORD ExceptionFlags; struct _EXCEPTION_RECORD *ExceptionRecord; PVOID ExceptionAddress; DWORD NumberParameters; UINT_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; } EXCEPTION_RECORD; */ //****************Optimize Key Except Words**************** #define TRY_BEGIN __try{ #define CATCH_END }__except(ExceptFilter(GetExceptionInformation())){ ExceptHandler();} #define TRY __try #define CATCH __except LONG WINAPI ExceptFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo) { char szException[100] = {0}; PEXCEPTION_RECORD pExceptionRecord = lpExceptionInfo -> ExceptionRecord; sprintf(szException, "*************Exception*************/ /r/nAddress/t: 0X%08X/r/nCode/t: 0X%08X/r/nFlags/t: 0x%08X", pExceptionRecord->ExceptionAddress, pExceptionRecord->ExceptionCode, pExceptionRecord->ExceptionFlags ); printf("%s/r/n",szException); return EXCEPTION_EXECUTE_HANDLER; } void WINAPI ExceptHandler() { printf("Handler Exception!/r/n"); //ExitProcess(0); } void testexption() { /* int a = 100; __try { int b = *(int *)NULL; a = 200; cout<<"Hello World"<<endl; } __except(ExceptFilter(GetExceptionInformation())) //__except(EXCEPTION_EXECUTE_HANDLER) { ExceptHandler(); cout<<"Exception "<<a<<endl; return; } */ int a = 100; TRY { int b = *(int *)NULL; a = 200; cout<<"Hello World"<<endl; } CATCH(ExceptFilter(GetExceptionInformation())) { ExceptHandler(); cout<<"Exception "<<a<<endl; return; } } int main(int argc, char* argv[]) { testexption(); return 0; } /* OUTPUTS: *************Exception************* Address : 0X004016D3 Code : 0XC0000005 Flags : 0x00000000 Handler Exception! Exception 100 */