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

c++异常捕获的更多相关文章

  1. .NET 基础 一步步 一幕幕[数组、集合、异常捕获]

    数组.集合.异常捕获 数组: 一次性存储多个相同类型的变量. 一维数组: 语法: 数组类型[] 数组名=new 数组类型[数组长度]; 声明数组的语法: A.数据类型 [] 数组名称= new 数据类 ...

  2. MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获

    public class BaseController : Controller { /// <summary> /// Called after the action method is ...

  3. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

  4. C#中的那些全局异常捕获

    1.WPF全局捕获异常     public partial class App : Application     {         public App()         {    // 在异 ...

  5. Spring-MVC开发之全局异常捕获全面解读

    异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...

  6. JavaScript异常捕获

    理论准备 ★   异常捕获 △ 异常:当JavaScript引擎执行JavaScript代码时,发生了错误,导致程序停止运行: △ 异常抛出:当异常产生,并且这个异常生成一个错误信息: △ 异常捕获: ...

  7. SQLServer异常捕获

    在SQLserver数据库中,如果有很多存储过程的时候,我们会使用动态SQL进行存储过程调用存储过程,这时候,很可能在某个环节就出错了,但是出错了我们很难去跟踪到出错的存储过程,此时我们就可以使用异常 ...

  8. Asp.Net MVC3(三)-MvcApp实现全局异常捕获

    定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...

  9. iphone 异常捕获处理

    iphone 异常捕获处理 1 void UncaughtExceptionHandler(NSException *exception) { 2 NSArray *arr = [exception ...

  10. iOS异常捕获

    文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Crash Callstack分析 – 进⼀一步分析 五. demo地址 六. 参考文献 前言 ...

随机推荐

  1. python file 文件读写

    python 文本对象 继承自C的stdio包 打开 可以用内置的open()函数创建 with open("hello.txt") as f: for line in f: pr ...

  2. useradd 添加用户

    功能介绍 useradd命令用于Linux中创建的新的系统用户.useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号.使用useradd指令所建 ...

  3. Retrofit 2.1 入门

    Retrofit 2.1入门 , map);    try {        Response<String>body=call.execute();        System.out. ...

  4. 【POJ 1151】Atlantis

    离散化后扫描线扫一遍. 夏令营时gty学长就讲过扫描线,可惜当时too naive,知道现在才写出模板题. 当时也不会线段树啊233 #include<cstdio> #include&l ...

  5. 2016年第2周读书笔记与工作笔记 scrollIntoView()与datalist元素

    这一周主要是看了html5网页开发实例与javascript 高级程序设计,供以后翻阅查找.  html5网页开发实例第1章与第二章的2.1部分: 第1章内容: html5在w3c的发展史. 浏览器的 ...

  6. java-读取类中的属性名称和值

    方法 /** * 获取类中的所有属性明名称和值(因涉及到可能会是继承关系的父类,所以从f中去属性名称,从f2中取值,两个可以一样,也可以使父类) * @param f:读取属性类(如果取父类的,则这里 ...

  7. 如何更新firefox中的flash

    要了解当前安装的版本是否为最新版本,请访问 插件检查页面http://www.mozilla.com/plugincheck/  ,如果该页面告诉你 Flash 插件需要更新,请手动安装最新版本. 使 ...

  8. thinkphp框架中“关联操作”的完整定义详解

    在复杂的关联操作中,如果要给关联定义增加可选的属性,我们可以采用完整定义的方式. 完整定义的格式是: protected $_link = array(     '关联表名1'  =>  arr ...

  9. 【HDU 1150】Machine Schedule(二分图匹配)

    机器的不同模式为点,对于每个job,建两条边 A机器需要的模式<->B机器需要的模式. 问题转化为最小点覆盖,然后用二分图的最小点覆盖==最大匹配,用匈牙利算法解. #include &l ...

  10. 【BZOJ-3275&3158】Number&千钧一发 最小割

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 748  Solved: 316[Submit][Status][Discus ...