彻底接管程序异常处理
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);
...//执行原函数
}
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);
...//执行原函数
}
相关文章推荐
- android 中处理崩溃异常并重启程序
- Java程序异常处理的特殊情况
- 编写一个程序,求输入数的平方根。设置异常处理,对输入负数的情况给出提示
- Java源码-第一个异常处理小程序:整数除法
- PHP中的异常处理对程序执行效率的影响
- DELPHI基础教程 第十二章 异常处理与程序调试(二)
- 如何处理Windows Forms程序中未处理的异常
- C语言异常处理机制——为您的C程序添加异常处理
- Server.Transfer跳转异常,post请求未找到HTTP处理程序
- Release和Debug程序的不同及异常处理
- 体面地处理程序的未捕获异常
- 程序中的异常处理(自定义UncaughtExceptionHandler)
- Python(异常处理与程序调试)
- 程序异常的处理:
- Oracle异常处理—ORA-12514:监听程序当前无法识别连接描述符中请求的服务
- android 中处理崩溃异常并重启程序出现页面重叠的问题
- CrashHandler--程序异常退出处理
- 关于六种Java异常处理程序的陋习
- Oracle异常处理—ORA-12514:监听程序当前无法识别连接描述符中请求的服务
- 异常处理程序学习笔记