首页 游戏 软件 排行 专题
C与C++中的异常处理
  • C与C++中的异常处理PDF 高清文字版

  • 大小:465KB更新:2010-11-26 17:33
  • 类别:电子教程系统:WinXP, WinAll
1.1 异常分类
基于Dr. GUI的建议,我把我的第一个专栏投入到“程序异常”的系列上。我认识到,“exception”这个术语有些不明确并和上下文相关,尤其是C++标准异常(C++ standard exceptions)和Microsoft的结构化异常(structured exception handling) 。不幸的的是,“异常”一词太常见了,随时出现在语言的标准和常见的编程文献中。因为不想创造一个新名词,所以我将尽力在此系列的各部分中明确我对“异常”的用法。
z Part 1概述通常意义上的异常的性质,和标准C库提供的处理它们的方法。
z Part 2纵览Microsoft 对这些标准C库方法的扩展:专门的宏和结构化异常处理。
z Part 3及其余将致力于标准C++异常处理体系。
(C语言使用者可能在Part2后放弃,但我鼓励你坚持到底;我所提出的许多点子同样适用于C,虽然不是很直接。 )
本质上看,程序异常是指出现了一些很少发生的或出乎意料的状态,通常显示了一个程序错误或要求一个必须提供的回应。不能满足这个回应经常造成程序功能削弱或死亡,有时导致整个系统和它一起down掉。不幸的是,试图使用传统的防护方法来编制健壮的代码经常只是将一个问题(意外崩溃)换成了另外一个问题(更混乱的设计和代码) 。
1. 异常和标准 C 对它的支持2
2. Microsoft 对异常处理方法的扩展...12
3. 标准 C++异常处理的基本语法和语义....27
4. 实例剖析 EH.33
5. C++的 new 和delete 操作时的异常处理....40
6. Microsoft 对于的实现版本中的异常处理.47
7. 部分构造及 placement delete....53
8. 自动删除,类属 new 和delete、placement new 和 placement delete 59
9. placement new 和 placement delete,及处理构造函数抛出的异常68
10. 从私有子对象中产生的异常....74
11. 异常规格申明...83
12. unexpected()的实现上固有的限制..89
13. 异常安全.94
14. 模板安全....100
15. 模板安全(续)..107
16. 指导方针....113
17. C++异常和 Visual C++ SEH 的混合使用..120

然后,创建一个新的Visual C++控制台项目,并包含EH.CPP为唯一的源文件。使用默认项目属性,但打开“生成源码/汇编混合的.asm文件”选项。编译出Debug版本。在我机器上,得到的EH.exe是23,040字节。
事件链:

第四层try块触发了一个异常。这导致顺嵌套链向上搜索,查找愿意捕获这个异常的异常过滤器。

碰到的第一个异常过滤器(在第三层)得出了EXCEPTION_CONTINUE_SEARCH,所以拒绝捕获这个异常。继续搜索下一个异常处理函数。

碰到的下一个异常过滤器(在第一层)得出了EXCEPTION_EXECUTE_HANDLER。这次,这个过滤器捕获这个异常。因为它求得的值,异常将被终止。

控制权回到异常发生点,开始退栈。沿路所有的终止处理函数被运行,并且所有的处理函数都知道异常终止发生了。一直退栈到控制权回到捕获异常的异常处理函数(在第一层)。在退栈时,只有终止处理函数被执行,中间的其它代码被忽略。

控制权一回到捕获异常的异常处理函数(在第一层),将以正常状态继续执行。

注意,控制权在同一嵌套层传递了两次:第一次异常过滤表达式求值,第二次在退栈和执行终止处理函数时。这造成了一种危害可能:如果一个异常过滤表达式以某种终止处理函数不期望的方式修改了的什么。一个基本原则就是,你的异常过滤器不能有副作用;如果有,则必须为你的终止处理函数保存它们。
玩家留言 跟帖评论
查看更多评论
相关应用
猜你喜欢

开发者其他应用

同类下载
其它版本