VC++编译异常相关说明

开发 后端
VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台,但是有时会出现VC++编译异常的现象。

要想学习好VC必须具备良好的C/C++的基础,必要的英语阅读能力也是必不可少的,因为大量的技术文档多以英文形式发布,否则就会导致VC++编译异常,这大大的影响了程序员的效率。

回忆一下我在第一节中介绍的EXCEPTION_REGISTRATION结构,我们曾用它向操作系统注册了发生异常时要被调用的回调函数。VC++也是这么做的,不过它扩展了这个结构的语义,在它的后面添加了两个新字段:

  1. struct EXCEPTION_REGISTRATION   
  2. {   
  3.     EXCEPTION_REGISTRATION* prev;   
  4.     DWORD handler;   
  5.     int id;   
  6.     DWORD ebp;   
  7. };  

VC++编译异常会为绝大部分函数③添加一个EXCEPTION_REGISTRATION类型的局部变量,它的最后一个字段(ebp)与栈桢指针指向的位置重叠。函 数的序言创建这个结构并把它注册给操作系统,尾声则恢复主调函数的EXCEPTION_REGISTRATION。id字段的意义我将在下一节介绍。

VC++编译函数时会为它生成两部分数据:
a)异常回调函数
b)一个包含函数重要信息的数据结构,这些信息包括catch块、这些块的地址和这些块所关心的异常的类型等等。我把这个结构称为funcinfo,有关它的详细讨论也在下一节。

是考虑了异常处理之后的运行时堆栈。widget的异常回调函数位于由FS:[0]指向的异常处理链的开始位置(这是由widget的序言设置的)。

异常处理程序把widget的funcinfo结构的地址交给函数__CxxFrameHandler,__CxxFrameHandler会检查这个结 构看函数中有没有catch块对当前的异常感兴趣。

如果没有的话,它就返回ExceptionContinueSearch给操作系统,于是操作系统会从 异常处理链表中取得下一个结点,并调用它的异常处理程序(也就是调用当前函数的那个函数的异常处理程序)。

这一过程将一直进行下去——直到处理程序找到一个能处理当前异常的catch块为止,这时它就不再返回操作系统了。但是在调用catch块之前(由于有 funcinfo结构,所以知道catch块的入口,参见图3),必须进行堆栈展开,也就是清理掉当前函数的栈桢下面的所有其他的栈桢。这个操作稍微有点 复杂。

因为:异常处理程序必须找到异常发生时生存在这些栈桢上的所有局部对象,VC++编译异常并依次调用它们的析构函数。后面我将对此进行详细介绍。 异常处理程序把这项工作委托给了各个栈桢自己的异常处理程序。从FS:[0]指向的异常处理链的第一个结点开始,它依次调用每个结点的处理程序,告诉它堆 栈正在展开。

与之相呼应,这些处理程序会调用每个局部对象的析构函数,然后返回。此过程一直进行到与异常处理程序自身相对应的那个结点为止。 由于catch块是函数的一部分,所以它使用的也是函数的栈桢。因此,在调用catch块之前,异常处理程序必须激活它所隶属的函数的栈桢。

其次,每个catch块都只接受一个参数,VC++编译异常其类型是它希望捕获的异常的类型。异常处理程序必须把异常对象本身或者是异常对象的引用拷贝到catch块的栈 桢上,编译器在funcinfo中记录了相关信息,处理程序根据这些信息就能知道到哪去拷贝异常对象了。

【编辑推荐】

  1. C与C++中标准输入实现方式上的一点区别
  2. C++编译器如何对Const常量进行分配存储空间
  3. C++类库设计的基本构思与方法
  4. 玩转C++语言的几种方法
  5. 如何更好的进行C++代码编制
责任编辑:chenqingxiang 来源: NET130
相关推荐

2010-01-28 15:56:38

VC++ 6.0编译

2010-01-27 17:42:58

VC++开发环境

2010-02-01 15:41:55

扩展Python

2010-01-22 10:44:10

VC++应用程序

2010-06-09 17:20:05

Mrtg window

2010-02-01 17:41:54

Python 解释器

2010-02-01 16:32:49

Python脚本

2009-12-31 14:50:57

ADO组件

2009-12-25 15:57:14

ADO调用

2009-12-24 15:42:01

ADO类库

2010-01-08 14:48:26

Javascritp处

2009-12-29 16:33:35

ADO.Net Tea

2010-01-05 17:35:09

JSON数组格式

2010-01-12 18:06:58

VC环境

2009-12-23 09:26:56

ADO.NET属性

2010-01-21 17:22:21

VC++

2011-07-03 16:19:19

2010-01-07 09:31:27

Json数据异常

2010-01-26 13:29:46

VC++应用程序

2011-07-13 11:20:55

VC++ODBC
点赞
收藏

51CTO技术栈公众号