您的位置:首页 > 其它

彻底接管程序异常处理

2011-08-05 15:32 721 查看
 1、SetUnhandledExceptionFilter可以设置异常处理函数过滤,就是可以在异常处理链中插入自己的异常处理函数。所以只要设置好我们的异常处理函数就可以捕获到Unhandled Exception。当然,时机一般选择在main函数开头或者是MFC程序的App::InitInstance开头。

SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

我们的异常处理函数:

LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)

{

 ::MessageBox(NULL, "Except", "", MB_OK);

 return EXCEPTION_CONTINUE_EXECUTION;

}

注意:返回值有3个,含义如下:

EXCEPTION_CONTINUE_EXECUTION (–1) 异常被忽略,表示错误已经被修复,请从异常发生处继续执行。

EXCEPTION_CONTINUE_SEARCH (0) 异常不被识别,表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束。

EXCEPTION_EXECUTE_HANDLER (1) 异常已经被识别,表示我已经处理了异常,可以优雅地结束了。
 
2、重载CWinApp::ProcessWndProcException。对于MFC的程序,有些内部抛出的异常,上面的方法捕捉不到。这时就需要重载ProcessWndProcException函数,接管MFC的异常处理函数。我们在MFC程序的APP类里面重载的函数原型:
LRESULT CExceptApp::ProcessWndProcException(CException* e, const MSG* pMsg)

{

 ::MessageBox(NULL, "Except", "", MB_OK);

 return 0;

}
 
3、对于某些特殊的异常,其他方法都捕捉不到的。需要Inline Hook UnhandledExceptionFilter函数。函数原型如下:
LONG __stdcall Hooked_UnhandledExceptionFilter(_EXCEPTION_POINTERS *ExceptionInfo)

{

 ::MessageBox(NULL, "Except3", "", MB_OK);
...//执行原函数
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息