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) 异常已经被识别,表示我已经处理了异常,可以优雅地结束了。
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;
}
{
::MessageBox(NULL, "Except", "", MB_OK);
return 0;
}
3、对于某些特殊的异常,其他方法都捕捉不到的。需要Inline Hook UnhandledExceptionFilter函数。函数原型如下:
LONG __stdcall Hooked_UnhandledExceptionFilter(_EXCEPTION_POINTERS *ExceptionInfo)
{
::MessageBox(NULL, "Except3", "", MB_OK);
{
::MessageBox(NULL, "Except3", "", MB_OK);
...//执行原函数
}
本文详细介绍了如何使用SetUnhandledExceptionFilter、重载CWinApp::ProcessWndProcException和InlineHookUnhandledExceptionFilter来实现自定义异常处理,特别针对MFC程序提供了解决方案。
3516

被折叠的 条评论
为什么被折叠?



