已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SEH(结构化异常处理) SEH (“Structured Exception Handling”), 即结构化异常处理.是Windows 操作系统提供给程序设计者的强 有力的处理程序错误或异常的武 器。 大家都知道,在C+中有较 完善的异常处理机制,同样在C 语言中也有很不错的异常处理机 制来支持。那么为什么现在此处 还在讨论操作系统平台中所提供 的异常处理机制呢? 在许多系统中,编程语言所 提供的异常处理机制的实现,都 是建立在操作系统中所提供的异 常处理机制之上,如Windows平 台上的VC编译器所实现的C+异 常处理模型,它就是建立在SEH 机制之上的 。具体关系图如下: 因此,操作系统平台中所提供的异 常处理机制是非常有必要的。而且,异 常处理机制的实现也是操作系统设计时 的一个重要课题。微软在Windows中引 入SEH的主要动机是为了便于操作系统 本身的开发。操作系统的开发人员使用 SEH,使得系统更加强壮。我们也可以 使用SEH,使我们的自己的程序更加强 壮。 使用SEH的好处就是当你编 写程序时,只需要关注程序要完 成的任务。如果在运行时发生什 么错误,系统会发现并将发生的 问题通知你。这样的分离,可以 使你集中精力处理眼前的工作, 而将可能发生的错误放在后面处 理。 我们虽然都知道,SEH是 Windows系列操作系统平台提供 的一种非常完善的异常处理机制 。但这毕竟有些过于抽象了,对 于程序员而言,它应该有一套类 似于像C+中那样的try,catch, throw等几个关键字组成的完整的 异常处理模型。 SHE确实也有类似的语法,它由 如下几个关键字组成: _try _except _finally _leave 注意! 不要将结构化异常处理同C+的异常 处理相混淆。C+异常处理是一种不同形 式的异常处理,其形式是使用C+关键字 catch和throw。微软的Visual C+支持 C+的异常处理,并且在内部实现上利用 了已经引入到编译程序和Windows操作系 统的结构化异常处理的功能。 SEH实际包含两个主要功能: 结束处理( termination handling ) 异常处理( exception handling ) 结束处理 一个结束处理程序能够确保去调用和执行一个代 码块(结束处理程序,termination handler),而不 管另外一段代码(保护体,guarded body)是如何退 出的。结束处理程序的文法结构(使用微软的Visual C+编译程序)如下: _ try和_ finally关键字用来标出 结束处理程序两段代码的轮廓。在上面 的代码段中,操作系统和编译程序共同 来确保结束处理程序中的_ finally代码 块能够被执行,不管保护体(_try块) 是如何退出的。不论你在保护体中用 return,还是goto,或者是longjump, 结束处理程序(_finally块)都将被调 用。 来看一个简单的程序: #include void main() puts(“hello“); _try puts(“_try块中“); / 注意,下面return语句直接让函数返 回了 return; _finally puts(“_finally块中“); puts(“world“); 程序运行结果如下: hello _try块中 _finally块中 Press any key to continue 由此可见: 不管在何种情况下,在离 开当前的作用域_finally 块区域内的代码都将会被 执行到 _finally块被执行的流程,无外乎三种情况: 顺序执行到_finally块区域内的代码,这 种情况很简单,容易理解 goto语句或return语句引发的程序控制流 离开当前_try块作用域时,系统自动完成 对_finally块代码的调用 由于在_try块中出现异常时,导致程序控 制流离开当前_try块作用域,这种情况下 也是由系统自动完成对_finally块的调用 无论是第2种,还是第3种情 况,毫无疑问,它们都会引起很 大的系统开销,编译器在编译此 类程序代码时,它会为这两种情 况准备很多的额外代码。 一般第2种情况,被称为“局 部展开”;第3种情况,被称为“全 局展开” 。 对于第2种情况,程序员完全可以有效地 避免它,避免“局部展开”引起的不必要的额外 开销。在一个函数中,可能有多处的return语 句。针对这种情况,SEH提供了一种非常有 效的折衷方案,那就是_leave关键字所起的 作用,它既具有像goto语句和return语句那样 类似的作用(由于检测到某个程序运行中的 错误,需要马上离开当前的_try块作用域) ,但是又避免了“局部展开” 的额外开销。 来看一个简单的例子: #include void main() puts(“hello“); _try int* p; puts(“_try块中“); / 直接跳出当前的_try作用域 _leave; p = 0; *p = 25; _finally puts(“_finally块中“); puts(“world“); 程序运行结果如下: hello _try块中 _finally块中 world Press any key to continue 程序中利用_leave关键 字,在执行错误语句p=0; *p=25;之前,马上离开当前 的_try块作用域 ,避免了“局 部展开” 的额外开销 。 建议大家在编程时不妨多 用_leave关键字来提高程序 的性能。 结束处理小结: 1、 “不管在何种情况下,在离开当前的作用 域时,finally块区域内的代码都将会被执行到”, 这是核心法则。 2、 goto语句和return语句,在其它少数情况 下,break语句以及continue语句等,它们都可 能会导致程序的控制流非正常顺序地离开_try 作用域,此时会发生SEH的“局部展开”。记住, “局部展开”会带来较大的开销,因此,程序员应 该尽可能采用_leave关键字来减少一些不必要 的额外开销。 异常处理 异常是我们不希望有的事件,异常分为硬 件异常和软件异常。其中CPU引发的异常,就 是所谓的硬件异常;操作系统和应用程序引发 相应的异常,称为软件异常。 当出现一个硬件或软件异常时,操作系统 向应用程序提供机会来考察是什么类型的异常 被引发,并能够让应用程序自己来处理异常。 下面就是异常处理程序的文法结构(使用 微软的Visual C+编译程序): 注意:_except 关键字。每当你建立 一个try块,它必须 跟随一个finally块 或一个except块。一 个try 块之后不能既 有finally块又有 except块。但可以在 try-except块中嵌套 try-finally块,反 过来也可以。 与结束处理程序不同,异常过滤器和异常处理 程序是通过操作系统直接执行的,编译程序在计算 异常过滤器表达式和执行异常处理程序方面不做什 么事。 异常过滤器(exception filter)跟在_except 关键字后面 ,它可以是各种类型的表达式,例如, 它可以是一个函数调用,或是一个条件表达式,或 是一个逗号表达式,或干脆就是一个整型常量等等 。操作系统根据其计算后的不同结果,对异常进行 不同的处理。 MSDN中对查找匹配恰当的异常处理模块的 过程等几条规则如下: 受监控的代码模块被执行(也即_try定义 的模块代码); 如果上面的代码执行过程中,没有出现异 常的话,那么控制流将转入到_except子 句之后的代码模块中; 如果出现异常的话,那么控制流将进入到 _except后面的表达式中,也即首先计算 这个表达式的值,之后再根据这个值,来 决定做出相应的处理。 异常过滤器表达式的值有三种情况,如下: 1、EXCEPTION_CONTINUE_EXECUTION (1) ,表示 异常被忽略,控制流将在异常出现点之后,继续恢复运 行。 2 、EXCEPTION_CONTINUE_SEARCH (0) ,表示异常 不被识别,也即当前的这个_except模块不是这个异常 错误所对应的正确的异常处理模块。系统将继续到上一 层的try-except域中继续查找一个恰当的_except模块 。如果找不到,将报错。 3、EXCEPTION_EXECUTE_HANDLER (1) ,表示异常 已经被识别,也即当前的这个异常错误,系统已经找到 了并能够确认,这个_except模块就是正确的异常处理 模块。控制流将进入到_except模块中。 下面通过一个简单的例子来加深对以上规则的理解: #include #include void main() puts(“hello“); / 定义受监控的代码模块 _try int a,b,c;a=0;b=1; c=b/a; puts(“in try“); /定义异常处理模块 _except(1) puts(“in except“); puts(“world“); 为方便理解,异常过 滤器直接使用整型常量。 对于程序中的异常,修改 该整型常量的值,程序的 运行结果各不相同。 异常处理小结: (1) C+异常模型用try-catch语法定义, 而SEH异常模型则用try-except语法; (2) 与C+异常模型相似,try-except也支 持多层的try-except嵌套。 (3) 与C+异常模型不同的是,try-except 模型中,一个try块只能是有一个except块 ;而C+异常模型中,一个try块可以有多 个catch块。 (4) 与C+异常模型相似,try-except模型中,查找 搜索异常模块的规则也是逐级向上进行的。但是稍有 区别的是,C+异常模型是按照异常对象的类型来进 行匹配查找的;而try-except模型则不同,它通过一 个表达式的值来进行判断。如果表达式的值为1( EXCEPTION_EXECUTE_HANDLER),表示找到了异
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教程教案上学期
- 玉溪师范学院《现代教育技术应用》2021-2022学年第一学期期末试卷
- 玉溪师范学院《小学语文教学设计与实践训练》2022-2023学年第一学期期末试卷
- 影视鉴赏教育课件
- 块料楼地面施工工艺
- 2024年红外光学测量雷达项目评价分析报告
- 2023年复配色粉项目综合评估报告
- 2024届贵州安顺市平坝区集圣中学高三下学期3月统一联合考试数学试题
- 仓储配送合同流程
- 采购合同资金结算流程
- 2024时事政治考试题库(100题)
- DL∕T 5776-2018 水平定向钻敷设电力管线技术规定
- (正式版)SH∕T 3548-2024 石油化工涂料防腐蚀工程施工及验收规范
- 教育新篇章:数字化转型
- 中国非物质文化遗产智慧树知到期末考试答案章节答案2024年云南大学
- (高清版)DZT 0432-2023 煤炭与煤层气矿产综合勘查规范
- 大学生职业生涯规划婴幼儿托育服务与管理
- 行为生态学-北京师范大学中国大学mooc课后章节答案期末考试题库2023年
- 附件华纺星海家园二期项目情况汇报已开未竣版
- 小学生小品剧本3篇 小学生3人小品剧本
- 人感染H7N9禽流感防控应急演练脚本
评论
0/150
提交评论