博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++异常捕获
阅读量:6974 次
发布时间:2019-06-27

本文共 1045 字,大约阅读时间需要 3 分钟。

概念:“C++异常”就是 try{}catch(...){}“SEH异常”就是 __try{} __except(-1/0/1){}(关于这两种异常,如有不了解的地方,网上有很多资料可以参考)目前微软所有的VC编译器(从VC6到VC2010),都默认是打开对C++异常的编译支持的(位于项目选项中的“代码生成”->启用C++异常:/EHsc,VC6是Enable Exception handling)(以下需要仔细阅读)在VC6中,对EXE工程是同时默认开启“C++异常可以捕获SEH异常”。在此条件下,用“C++异常”也可以捕获向非法地址的读写等基本的Windows异常。如:try{ int *a=0; *a=100; }catch(...){printf("excption!");},执行到*a=100时,会跳转到catch块,并执行printf。但是,VC6建立的DLL或其他非EXE工程,如果是Release模式,并且编译时,启用了代码自动优化,那么结果就变成了只启用了“C++异常”,即“C++异常无法捕获SEH异常”。这样的一个后果是,在DLL中,即使像这样用try{ int *a=0; *a=100; }catch(...){printf("excption!");}保护代码,当代码执行到*a=100非法地址赋值语句时,catch(...)却什么都捕获不到,会直接造成程序崩溃。除非明确使用“SEH异常”__try...__except(1)..,才能捕获到这种Windows异常。相应的解决办法:对于从VC7开始以及以后的VC++,在“代码生成”->“启用C++异常”处,均有第三个选项:“有效,但有SEH异常(/EHa)”,这样就是可以让程序“使用C++异常也能够捕获到SEH异常”。这样无论是在EXE还是DLL中,try{}catch(...){}同样可以捕获Windows异常。对于VC6的非EXE工程,有以下两个方法,来用try..catch..捕获Windows的SEH异常:1、通过关闭编译时的优化(禁用或者只使用Default级别,个人感觉是因为VC6的编译器不是非常完善)。2、通过在当前工程的编译选项中,手工加上 /EHa 参数。这个编译选项是没有界面可以去设置的,只能手工添加。这两个方法选择任何一个都可以。建议使用第二个方法。另外要注意“C++异常”与“SEH异常”无法同时在同一个函数中混用。更多 0
最好不要用C++异常去捕获SEH异常。

 

转载地址:http://wsesl.baihongyu.com/

你可能感兴趣的文章
WCF开发常见问题:“There is already a listener on IP endpoint 0.0.0.0:4503”
查看>>
现在还有perlmonks网站这样的网站?!
查看>>
自动到ftp下载并替换文件内容
查看>>
生成服务器密码的shell脚本
查看>>
信号捕捉
查看>>
MariaDB三之DDL,DML的应用
查看>>
GNS3模拟ASA842
查看>>
使用PowerShell配置Hyper-v Server重复数据删除
查看>>
javascript测试
查看>>
Java线程池
查看>>
解决方案:如何让ADC产品将HTTP请求负载的更加均衡
查看>>
开始运行你的第一个Java Web 项目
查看>>
PHP学习:$_GET,$_POST,$_REQUEST和$_SERVER的一些用法,以及parse_str方法
查看>>
java下DES加密与解密
查看>>
Nagios使用SendEmail发送邮件
查看>>
Domino8.5.1和Exchange2010共用一个邮件域实现邮件收发
查看>>
截图留存
查看>>
linux PDF转换为SWF
查看>>
ASP.net 中的AJAX学习记录之四 updateProgress控件的简单用法
查看>>
怎样自动生成makefile
查看>>