三、在函数声明中进行异常情况指定 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

为便于阅读程序,使用户在看程序时能够知道所用的函数是否会抛出异常信息以及异常信息可能的类型,C++允许在声明函数时列出可能抛出的异常类型,如可以将例1中第二个程序的第3行改写为
double triangle(double,double,double) throw(double);
表示triangle函数只能抛出double类型的异常信息。如果写成
double triangle(double,double,double) throw(int,double,float,char);
则表示triangle函数可以抛出int,double,floatchar类型的异常信息。异常指定是函数声明的一部分,必须同时出现在函数声明和函数定义的首行中,否则在进行函数的另一次声明时,编译系统会报告类型不匹配
如果在声明函数时未列出可能抛出的异常类型,则该函数可以抛出任何类型的异常信息。如例1中第2个程序中所表示的那样。
如果想声明一个不能抛出异常的函数,可以写成以下形式:
double triangle(double,double,double) throw();//throw无参数
这时即使在函数执行过程中出现了throw语句,实际上也并不执行throw语句,并不抛出任何异常信息,程序将非正常终止。

 

 

 

四、在异常处理中处理析构函数

如果在try(try块中调用的函数)中定义了类对象,在建立该对象时要调用构造函数。在执行try (包括在try块中调用其他函数) 的过程中如果发生了异常,此时流程立即离开try块。这样流程就有可能离开该对象的作用域而转到其他函数,因而应当事先做好结束对象前的清理工作,C++的异常处理机制会在throw抛出异常信息被catch捕获时,对有关的局部对象进行析构(调用类对象的析构函数) 析构对象的顺序与构造的顺序相反,然后执行与异常信息匹配的catch块中的语句。

 

3 在异常处理中处理析构函数。
这是一个为说明在异常处理中调用析构函数的示例,为了清晰地表示流程,程序中加入了一些cout语句,输出有关的信息,以便对照结果分析程序。
#include <iostream>
#include <string>
using namespace std;
class Student
{public:
   Student(int n,string nam)//定义构造函数
{cout<<constructor-<<n<<endl;
num=n;name=nam;}
~Student( ){cout<<destructor-<<num<<endl;}//定义析构函数
   void get_data( );                                 //成员函数声明
private:
int num;
string name;
 };
void Student::get_data( )                           //定义成员函数
{if(num==0) throw num;                            //num=0,抛出int型变量num
  else cout<<num<< <<name<<endl;                 //num≠0,输出num,name
  cout<<in get_data()<<endl;                     //输出信息,表示目前在get_data函数中
 }
void fun( )
{Student stud1(1101,Tan);               //建立对象stud1
stud1.get_data( );                        //调用stud1get_data函数
Student stud2(0,Li);                   //建立对象stud2
stud2.get_data( );                        //调用stud2get_data函数
}
int main( )
{cout<<main begin<<endl;                 //表示主函数开始了
cout<<call fun( )<<endl;                 //表示调用fun函数
try
  {fun( );}                                 //调用fun函数
catch(int n)
  {cout<<num=<<n<<,error!<<endl;}      //表示num=0出错
cout<<main end<<endl;                   //表示主函数结束
return 0;
}
程序运行结果如下:
main begin
call fun( )
constructor-1101
1101 tan
in get_data()
constructor-0
destructor-0
destructor-1101
num=0,error!
main end