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

C++ 异常处理

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

 

8.1.5 处理异常
异常处理程序由紧接在try-block之后的catch关键字确定。关键字catch也可紧接在其他catch块之后。程序发送的每个异常都必须被异常处理程序捕捉和处理。当异常的类型与catch的条件语句中的类型匹配(或可转换)时,异常被处理程序捕捉。一旦类型匹配成立,程序控制转到处理程序且栈被打开。

处理程序确定处理程序不正常状态的操作。
处理程序执行完毕后,程序会在当前的try-block中发送异常的那个处理程序后继续运行。其他处理程序不会对当前异常做出反映。goto语句可用于将程序控制跳出一个处理程序。若程序提供异常处理程序失败,程序终止。

注意 这些例子通过命令行使用bcc32.exe可成功地编译并运行,而不需使用IDE。
例1:


例2:下例说明当捕捉到的异常是类层次结构的一部分,则需从最末的派生类开始。


例3:下例中,catch(...)块可处理任何类型的异常。这个块也是try-block中唯一的处理程序。


8.1.6 异常规范
C++提供一种名为exceptionspecification的特性可将一个函数可能发送的异常在声明中列出。exceptionspecification使用时类似于函数声明的后缀,句法如下:


这样的函数后缀不是函数类型的一部分。因此,指向函数的指针不会受exceptionspecification的影响。像这样的指针只检查函数返回值和参数类型。因此,下列声明是合法的:


当重载虚拟函数时需要小心。因为exceptionspecification不是函数类型的一部分,所以可能会破坏程序设计。
例1:在下例中,定义的派生类BETA::vfunc不发送任何异常,这偏离了原始的函数声明。


下例是带有异常规范的函数。

这样的函数的定义和所有的声明必须有一个包含相同的type-ids集的异常规范。若函数发送一个规范中未列出的异常,程序会调用unexpected。

8.1.7 异常处理的构造和析构
若不能成功地构造一个对象,类构造函数会发送异常。当按值发送对象且异常被引发时,拷贝构造函数被调用。拷贝构造函数在发送点初始化一个临时对象。应用程序也可产生另外的拷贝。

如果构造函数发送了异常,对象的析构函数就不需要被调用。析构函数仅为基类和那些在try-block中构造成功的对象调用。为try-block中构造的throw语句后的对象调用析构函数的进程称为stackunwinding。若析构函数在这个进程中引发一个异常且没有处理,则terminate被调用。析构函数是缺省调用的,不过可通过使用-xd-编译器选项关闭缺省设置。

8.1.8 未处理的异常
如果一个异常被发送但没有发现事件处理程序,程序调用terminate函数。下例说明了程序中出现未处理的异常时如何处理。


8.1.9 设置异常处理选项
表8-1是C++Builder编译器的异常处理选项。
 
 
上一篇:BCB中用Sender参数实现代码重用(修正版)  下一篇:谁动了我的指针