c异常处理机制

c异常处理机制

ID:22831907

大小:434.58 KB

页数:28页

时间:2018-10-31

c异常处理机制_第1页
c异常处理机制_第2页
c异常处理机制_第3页
c异常处理机制_第4页
c异常处理机制_第5页
资源描述:

《c异常处理机制》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C++编译器如何实现异常处理译者注:本文在网上已经有儿个译本,但都不完整,所以我决定自己把它翻译过来。虽然力求信、雅、达,但鉴于这是我的第一次翻译经历,不足之处敬请谅解并指出。与传统语言相比,C++的一项革命性创新就是它支持异常处理。传统的错误处理方式经常满足不了要求,而异常处理则是一个极好的替代解决方案。它将正常代码和错误处理代码清晰的划分开來,程序变得非常干净并且容易维护。本文讨论了编译器如何实现异常处理。我将假定你己经熟悉异常处理的语法和机制。本文还提供了一个用于VC++的异常处理库,要用库中的处理程序替换掉VC++提供的那个,你只需要调用下面这个函数:instal

2、l_my_handler();之后,程序屮的所有异常,从它们被抛出到堆桟展开(stackunwinding),再到调用catch块,最后到程序恢复正常运行,都将由我的异常处理库来管理。与其它C++特性一样,C++标准并没有规定编译器应该如何来实现异常处理。这意味着每一个编译器的提供商都可以用它们汄为恰当的方式来实现它。下面我会描述一下VC++是怎么做的,但即使你使用其它的编译器或操作系统①,本文也应该会是一篇很好的学习材料。VC++的实现方式是以windows系统的结构化异常处理(SEH)②为基础的。结构化异常处理一概述在本文的讨论中,我认为异常或者是被明确的抛出的,或者

3、是由于除零溢出、空指针访问等引起的。当它发生时会产生一个中断,接下来控制权就会传递到操作系统的手中。操作系统将调用异常处理程序,检查从异常发生位置开始的函数调用序列,进行堆栈展开和控制权转移。Windows定义了结构“EXCEPTION_REGISTRATION”,使我们能够向操作系统注册自己的异常处理程序。structEXCEPTION_REGISTRATION{EXCEPTION一REGISTRATION*prev;DWORDhandler;};注册时,只需要创建这样一个结构,然后把它的地址放到FS段偏移0的位置上去就行了。下面这句汇编代码演示了这一操作:movFS:

4、[O],exc^regpprev字段用于建立一个EXCEFTION_REGISTRATION结构的链表,每次注册新的EXCEPTION_REGISTRATION时,我们都要把原来注册的那个的地址存到prev中。那么,那个异常回调函数长什么样呢?在excpt.h中,windows定义了它的原形:EXCEPTION—DISPOSIT工ON(*handler)(_EXCEPTION_RECORD*ExcRecord,void*EstablisherFrame,—CONTEXT*ContextRecord,void*DispatcherContext);不要管它的参数和返回值,我

5、们先来看一个简单的例子。下面的程序注册了一个异常处理程序,然后通过除以零产生了一个异常。异常处理程序捕获了它,打印了一条消息就完事大吉并退出了。#include#includeusingstd::cout;usingstd::endl;structEXCEPTION_REGISTRATION{EXCEPT工ON_REGISTRATION*prev;DWORDhandler;};EXCEPTION_DISPOSITIONmyHandler(_EXCEPTION_RECORD*ExcRecord,void*EstablisherFrame,—CONTEXT*ContextRe

6、cord,void*DispatcherContext){cout<<"Intheexceptionhandlern<

7、v;_asm{movEAX,FS:[0]movprev,EAXprev}reg.prev=(EXCEPTION_REGISTRATION*)//注册!_asm{movEAX,pregmovFS:[0],EAX}//产生一个异常intj=10/g_div;//异常,險零溢出}intmain()bar();return0;/*输出IntheexceptionhandlerJustademo.exiting•…*/注意EXCEPTION_REGISTRATION必须定义在栈上,并且必须位于比上十结点更低的内存地址上,Windows对

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

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

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