SEH结构化异常处理

SEH结构化异常处理

ID:39338381

大小:279.26 KB

页数:28页

时间:2019-07-01

SEH结构化异常处理_第1页
SEH结构化异常处理_第2页
SEH结构化异常处理_第3页
SEH结构化异常处理_第4页
SEH结构化异常处理_第5页
资源描述:

《SEH结构化异常处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、SEH(结构化异常处理)SEH(“StructuredExceptionHandling”),即结构化异常处理.是Windows操作系统提供给程序设计者的强有力的处理程序错误或异常的武器。大家都知道,在C++中有较完善的异常处理机制,同样在C语言中也有很不错的异常处理机制来支持。那么为什么现在此处还在讨论操作系统平台中所提供的异常处理机制呢?在许多系统中,编程语言所提供的异常处理机制的实现,都是建立在操作系统中所提供的异常处理机制之上,如Windows平台上的VC编译器所实现的C++异常处理模型,它就是建立在SEH机制之上的。具

2、体关系图如下:因此,操作系统平台中所提供的异常处理机制是非常有必要的。而且,异常处理机制的实现也是操作系统设计时的一个重要课题。微软在Windows中引入SEH的主要动机是为了便于操作系统本身的开发。操作系统的开发人员使用SEH,使得系统更加强壮。我们也可以使用SEH,使我们的自己的程序更加强壮。使用SEH的好处就是当你编写程序时,只需要关注程序要完成的任务。如果在运行时发生什么错误,系统会发现并将发生的问题通知你。这样的分离,可以使你集中精力处理眼前的工作,而将可能发生的错误放在后面处 理。我们虽然都知道,SEH是Window

3、s系列操作系统平台提供的一种非常完善的异常处理机制。但这毕竟有些过于抽象了,对于程序员而言,它应该有一套类似于像C++中那样的try,catch,throw等几个关键字组成的完整的异常处理模型。SHE确实也有类似的语法,它由如下几个关键字组成:__try __except __finally __leave注意!不要将结构化异常处理同C++的异常处理相混淆。C++异常处理是一种不同形式的异常处理,其形式是使用C++关键字catch和throw。微软的VisualC++支持C++的异常处理,并且在内部实现上利用了已经引入到编译程序

4、和Windows操作系统的结构化异常处理的功能。SEH实际包含两个主要功能:结束处理(terminationhandling)异常处理(exceptionhandling)结束处理一个结束处理程序能够确保去调用和执行一个代码块(结束处理程序,terminationhandler),而不管另外一段代码(保护体,guardedbody)是如何退出的。结束处理程序的文法结构(使用微软的VisualC++编译程序)如下:__try和__finally关键字用来标出结束处理程序两段代码的轮廓。在上面的代码段中,操作系统和编译程序共同来确保

5、结束处理程序中的__finally代码块能够被执行,不管保护体(__try块)是如何退出的。不论你在保护体中用return,还是goto,或者是longjump,结束处理程序(__finally块)都将被调用。来看一个简单的程序:#includevoidmain() {puts("hello"); __try {puts("__try块中"); //注意,下面return语句直接让函数返回了return; } __finally {puts("__finally块中"); }puts("world"); }程

6、序运行结果如下:hello __try块中__finally块中Pressanykeytocontinue由此可见:不管在何种情况下,在离开当前的作用域__finally块区域内的代码都将会被执行到__finally块被执行的流程,无外乎三种情况:顺序执行到__finally块区域内的代码,这种情况很简单,容易理解goto语句或return语句引发的程序控制流离开当前__try块作用域时,系统自动完成对__finally块代码的调用由于在__try块中出现异常时,导致程序控制流离开当前__try块作用域,这种情况下也是由系统自动

7、完成对__finally块的调用无论是第2种,还是第3种情况,毫无疑问,它们都会引起很大的系统开销,编译器在编译此类程序代码时,它会为这两种情况准备很多的额外代码。 一般第2种情况,被称为“局部展开”;第3种情况,被称为“全局展开”。对于第2种情况,程序员完全可以有效地避免它,避免“局部展开”引起的不必要的额外开销。在一个函数中,可能有多处的return语句。针对这种情况,SEH提供了一种非常有效的折衷方案,那就是__leave关键字所起的作用,它既具有像goto语句和return语句那样类似的作用(由于检测到某个程序运行中的错

8、误,需要马上离开当前的__try块作用域),但是又避免了“局部展开”的额外开销。来看一个简单的例子:#includevoidmain(){puts("hello");__try{int*p;puts("__try块中");//直接跳出当前的__

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。