彻底接管程序异常处理

本文详细介绍了如何使用SetUnhandledExceptionFilter、重载CWinApp::ProcessWndProcException和InlineHookUnhandledExceptionFilter来实现自定义异常处理,特别针对MFC程序提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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);
...//执行原函数
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值