如何进行C++异常处理?

开发 后端
我们知道,C#的语法与C++非常相似,实现从C++向C#的转变,其困难不在于语言本身,而在于熟悉.NET的可管理环境和对.NET框架的理解。

C++异常处理程序在函数中查找catch块时,它首先要判断异常发生的位置是否在当前函数(发生异常的那个函数)的一个try块中。是则查找与此try块相关的catch块表,否则直接返回。

先来看看它怎样找try块。编译时,编译器给每个try块都分配了start id和end id。通过funcinfo结构,异常处理程序可以访问这两个id,见图4。编译器为函数中的每个try块都生成了相关的数据结构。

上一节中,我说过C++异常处理给EXCEPTION_REGISTRATION结构加上了一个id字段。回忆一下图3,这个结构位于函数的栈桢上。异常发生时,处理程序读出这个值,看它是否在try块的两个id确定的区间[start id,end id]中。是的话,异常就发生在这个try块中;否则继续查看try块表中的下一个try块。

谁负责更新id的值,它的值又应该是什么呢?原来,编译器会在函数的多个位置安插代码来更新id的值,以反应程序的实时运行状态。比如说,编译器会在进入try块的地方加上一条语句,把try块的start id写到栈桢上。

找到try块后,处理程序就遍历与其关联的catch块表,看是否有对当前异常感兴趣的catch块。在try块发生嵌套时,异常将既源于内层try块, 也源于外层try块。这种情况下,处理程序应该按先内后外的顺序查找catch块。但它其实没必要关心这些,因为,在try块表中,C++异常处理总是把内层 try块放在外层try块的前面。
 
异常处理程序还有一个难题就是"如何根据catch块的相关数据结构判断这个catch块是否愿意处理当前异常"。这是通过比较异常的类型和catch块的参数的类型来完成的。例如下面这个程序:

  1. void foo()   
  2. {   
  3.     try   
  4.     {   
  5.         throw E();   
  6.     }   
  7.     catch(H)   
  8.     {   
  9.         //.   
  10.     }   
  11. }  

如果H和E的类型完全相同的话,catch块就要捕获这个异常。这意味着处理程序必须在运行时进行类型比较,对C等语言来说,这是不可能的,因为它们无法在 运行时得到对象的类型。

C++异常处理则不同,它有了运行时类型识别(runtime type identification,RTTI),并提供了运行时类型比较的标准方法。C++异常处理在标准头文件中定义了type_info类,它能在运行时代表一个类型。

catch块数据结构的第二个字段(ptype_info,见图4)是一个指向type_info结构的指针,它在运行时就代表catch块的参数 类型。type_info也重载了==运算符,能够指出两种类型是否完全相同。这样,异常处理程序只要比较(调用==运算符)catch块参数的 type_info(可以通过catch块的相关数据结构来访问)和异常的type_info是否相同。

就能知道catch块是不是愿意捕获当前异常了。 catch块的参数类型可以通过funcinfo结构得到,但异常的type_info从哪来呢?当编译器碰到。

【编辑推荐】

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

2010-01-20 13:29:40

C++环境

2010-01-20 09:32:30

C++类

2010-02-02 13:04:03

C++头文件

2010-01-20 10:49:29

Visual C++界

2010-01-15 19:05:42

学习C++

2010-01-12 09:59:08

Visual C++

2014-09-19 10:46:36

LuaCC++

2010-01-27 10:45:21

C++单例模式

2010-02-05 17:16:05

C++构造函数

2010-01-19 14:39:22

C++ Builder

2009-08-03 16:37:49

C#异常类

2010-01-22 16:21:50

C++ Builder

2010-01-27 16:39:48

C++编译器

2023-11-13 17:01:26

C++编程

2010-01-27 15:36:54

C++异常处理

2009-08-27 15:33:58

C# Cookie编程

2010-02-22 17:12:34

Python对象

2010-01-15 17:31:18

C++Test

2010-01-28 10:33:10

C++开发程序

2009-12-23 11:01:50

ADO.NET 批处理
点赞
收藏

51CTO技术栈公众号