VS2005之后 _set_se_translator有可能不起作用
来源:互联网 发布:软件生存周期是什么 编辑:程序博客网 时间:2024/05/17 22:36
_set_se_translator这个函数的目的就是把SEH异常转换成C++异常,这样用一个try catch块就能保证代码里面产生的任何异常都能被捕获到,从而达到程序不崩溃的目的。
但是VS2005之后的版本,微软增加了一些新的异常机制,新机制在出现错误时默认不通知应用程序,这时程序就崩溃了。
VS2005添加了这两个函数:_set_invalid_parameter_handler、_set_purecall_handler, 通过它们可以设置自己的异常处理函数。
经过测试,如果程序出现了Invalid Parameter的异常(比如atoi(null),就会出现这种异常),_set_se_translator会失效,try catch块捕获不到SEH异常。但是我这样设置的
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);//禁止CRT的异常处理修改SetUnhandledExceptionFilterDisableSetUnhandledExceptionFilter();
异常处理函数却可以正常捕获到SEH异常,dmp文件也可以正常生成。因为是未经处理的程序,所以程序会崩溃退出。
因此要想确保try catch块能够捕获到所有的异常,还必须调用_set_invalid_parameter_handler、_set_purecall_handler这两个函数,设置自己的处理函数,在处理函数里面抛出一个标准的C++异常(比如throw 1),这样try catch就可以捕获到了。
_set_invalid_parameter_handler(myInvalidParameterHandler);_set_purecall_handler(myPurecallHandler);
void myInvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved){OutputDebugStringA("Invalid Parameter Expression:");OutputDebugStringW(expression);// 必须抛出异常,否则无法定位错误位置throw 1;}
void myPurecallHandler(void){OutputDebugStringA("In _purecall_handler.");// 必须抛出异常,否则无法定位错误位置throw 1;}
经过测试: _set_se_translator这个函数只对当前线程有用,其它线程要想转换SEH的异常就必须调用_set_se_translator一次。而_set_invalid_parameter_handler、_set_purecall_handler这两个函数与SetUnhandledExceptionFilter一样,是全局的,只需调用一次即可。
0 0
- VS2005之后 _set_se_translator有可能不起作用
- _set_se_translator简介
- VS2005下BoundField的DataFormatString不起作用了?
- VS2005下BoundField的DataFormatString不起作用
- VS2005调试断点不起作用的解决方法
- VS2005调试断点不起作用的解决方法
- VS2005调试断点不起作用的解决方法
- VS2005、VS2008中SetUnhandledExceptionFilter函数不起作用
- View setAnimation之后再setVisibility不起作用
- 在iPod退位之后,Pono有可能取而代之吗?
- 删除cookie的时候,setMaxAge(0)有可能不起作用,需要加上cookie.setPath("/");[domain也很重要]
- 解决vs2005 在 ie8 中 设置断点不起作用
- 解决vs2005 在 ie8 中 设置断点不起作用 .
- QT 中继承QWidget之后,样式表不起作用 style stylesheet
- android 代码混淆之后 微信分享不起作用
- 页面中用focus不起作用,alert之后才起作用
- Android的setVisibility(View.GONE)不起作用在使用Animation之后.
- 运用dubbo框架之后logback.xml在Linux不起作用
- 数据库操作 大解
- dsa算法(22)
- 第36讲-项目一-M$pszi$y是嘛意思
- spring Ehcache启动报错的问题
- Linux 关闭、重启系统命令及#、$命令提示符小知识
- VS2005之后 _set_se_translator有可能不起作用
- iOS证书申请到应用上APP Store的流程
- 详细介绍一下 Smoke Testing(冒烟测试)
- 什么是HttpOnly
- Androide SQLiteDatabase数据库操作(转)
- JVM内存区域划分
- 高字节与低字节,高地址与低地址,大端模式与小端模式
- Android教你打造ioc框架
- Togglz