网站大量收购独家精品文档,联系QQ:2885784924

【2017年整理】SEH(与结构化异常处理).ppt

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【2017年整理】SEH(与结构化异常处理)

SEH(结构化异常处理);SEH (“Structured Exception Handling”), 即结构化异常处理.是Windows 操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。 ; 大家都知道,在C++中有较完善的异常处理机制,同样在C语言中也有很不错的异常处理机制来支持。那么为什么现在此处还在讨论操作系统平台中所提供的异常处理机制呢? ; 在许多系统中,编程语言所提供的异常处理机制的实现,都是建立在操作系统中所提供的异常处理机制之上,如Windows平台上的VC编译器所实现的C++异常处理模型,它就是建立在SEH机制之上的 。具体关系图如下:;Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0. Copyright 2004-2011 Aspose Pty Ltd.; 因此,操作系统平台中所提供的异常处理机制是非常有必要的。而且,异常处理机制的实现也是操作系统设计时的一个重要课题。微软在Windows中引入SEH的主要动机是为了便于操作系统本身的开发。操作系统的开发人员使用SEH,使得系统更加强壮。我们也可以使用SEH,使我们的自己的程序更加强壮。 ; 使用SEH的好处就是当你编写程序时,只需要关注程序要完成的任务。如果在运行时发生什么错误,系统会发现并将发生的问题通知你。这样的分离,可以使你集中精力处理眼前的工作,而将可能发生的错误放在后面处 理。; 我们虽然都知道,SEH是Windows系列操作系统平台提供的一种非常完善的异常处理机制。但这毕竟有些过于抽象了,对于程序员而言,它应该有一套类似于像C++中那样的try,catch,throw等几个关键字组成的完整的异常处理模型。 ;SHE确实也有类似的语法,它由如下几个关键字组成: __try __except __finally __leave ;注意!;SEH实际包含两个主要功能:;结束处理; __ try和__ finally关键字用来标出结束处理程序两段代码的轮廓。在上面的代码段中,操作系统和编译程序共同来确保结束处理程序中的__ finally代码块能够被执行,不管保护体(__try块)是如何退出的。不论你在保护体中用return,还是goto,或者是longjump,结束处理程序(__finally块)都将被调用。;来看一个简单的程序:;__finally块被执行的流程,无外乎三种情况: ; 无论是第2种,还是第3种情况,毫无疑问,它们都会引起很大的系统开销,编译器在编译此类程序代码时,它会为这两种情况准备很多的额外代码。 一般第2种情况,被称为“局部展开”;第3种情况,被称为“全局展开” 。; 对于第2种情况,程序员完全可以有效地避免它,避免“局部展开”引起的不必要的额外开销。在一个函数中,可能有多处的return语句。针对这种情况,SEH提供了一种非常有效的折衷方案,那就是__leave关键字所起的作用,它既具有像goto语句和return语句那样类似的作用(由于检测到某个程序运行中的错误,需要马上离开当前的__try块作用域),但是又避免了“局部展开” 的额外开销。 来看一个简单的例子:;#include stdio.h void main() { puts(hello); __try { int* p; puts(__try块中); // 直接跳出当前的__try作用域 __leave; p = 0; *p = 25; } __finally { puts(__finally块中); } puts(world); } ;结束处理小结:;异常处理; 注意:__except关键字。每当你建立一个try块,它必须跟随一个finally块或一个except块。一个try 块之后不能既有finally块又有except块。但可以在try-except块中嵌套try-finally块,反过来也可以。; 与结束处理程序不同,异常过??器和异常处理程序是通过操作系统直接执行的,编译程序在计算异常过滤器表达式和执行异常处理程序方面不做什么事。;MSDN中对查找匹配恰当的异常处理模块的过程等几条规则如下: ;异常过滤器表达式的值有三种情况,如下: ;下面通过一个简单的例子来加深对以上规则的理解:;异常处理小结:;(4) 与C++异常模型相似,try-except模型中,查找搜索异常模块的规则也是逐级向上进行的。但是稍有区别的是,C++异常模型是按照异常对象的类型来进行匹配查找的;而try-except模型则不

文档评论(0)

liwenhua11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档