AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

Win32下的结构异常

51自学网 http://www.51zixue.net

8.2.4 在C++中混用结构异常
在C++程序中混用结构异常时需要了解几项内容。首先,尽管C++Builder用Win32结构异常实现C++异常,C++异常对__except块来说仍时透明的。一个try块后可跟随一个except块或至少一个catch块。若试图混用二者会产生一个编译错误。需要处理两种类型异常的代码应该简单地在两个try块内嵌套:


函数throw()规范不会影响程序关于Win32异常的行为。另外,未处理的异常最后由操作系统处理(若调试器不首先处理它),不像C++程序那样调用terminate()。任何使用-xd编译器选项(缺省打开)编译的程序块将调用所有“自动”存储的对象的析构函数。栈打开操作从异常发生点到异常被捕捉点间发生。
C++程序中基于C的异常示例



8.2.5 定义异常
同一个程序内引发并处理Win32异常通常不太合适:C++异常能更好地做相同的工作,可移植性更好,并且使用更简单的语法。Win32异常确实有优点,然而,可处理它们的组件可能无法用同样的C++编译器编译。
第一步是定义异常。异常是下列格式的一个32位的整数(从位0开始),见表8-3:


除了定义异常的代码,还要决定异常是否包括附加的信息(可从异常记录中访问过滤器/处理程序)。在异常代码中加入附加的参数没有常规的方法。参见Win32帮助(在C++Builder联机帮助中)可获得更多信息。

8.2.6 引发异常
Win32异常由调用RaiseException()引发,声明如下:


其中:
点击放大

8.2.7 终止块
结构异常处理模型支持“终止块”,在被保护块正常退出后执行或经由异常。C++Builder编译器在C中以下列语法支持它:


终止块可由C++扩展支持,可在__finally块中处理清理程序:


下例说明终止块:



C++代码也能通过创建局部对象处理终止块,这些对象在范围退出时调用析构函数。由于C++Builder结构异常支持析构清理,这使得程序可以不用考虑异常的类型。
注意 有一个需要担心的情况,当异常被引发并没有处理程序时。对于C++异常,C++Builder编译器为局部对象调用析构函数(不要求由语言定义),而未处理的Win32异常,析构清理不发生。

 
 

上一篇:C++和Object Pascal对象模型  下一篇:C++ Builder 调试多线程应用程序