学科分类
目录
C++基础

异常规范说明

C++实现了异常抛出和处理的分离,因此在使用其他程序员编写的库或模块时就需要了解这些模块抛出的异常类型,方便在使用这些模块时编写相应的异常处理程序。C++提供了异常规范说明,即在函数声明的形参表后列出该函数可能抛出的异常类型,这样方便函数的使用者编写相应的catch块来捕获异常。

异常规范说明的语法形式如下所示:

函数返回值类型 函数名(形参表)throw(异常类型1, 异常类型2, …);
函数返回值类型 函数名(形参表)throw();

第一种语法形式中,在throw后依次列出可能抛出的各种异常类型,第二种语法形式说明该函数不抛出任何异常,除了上述两种形式外,还有第三种:

函数返回值类型 函数名(形参表);

这种形式与函数声明一致,形参表后没有任何表示抛出异常类型的说明,它表示该函数可能抛出任何类型的异常。

异常规范说明不是C++语法中的强制规定,因此出现第三种形式不会出现语法错误,但为规范起见,建议采用前两种语法形式。

例如可以将上一节案例中的int_div()函数声明为:

int int_div(int, int) throw(int);

在使用函数指针进行函数调用时,可以对函数指针也添加异常规范说明,代码如下所示:

void (*pfun)() throw(int);

通过指针pfun进行调用的函数,只能抛出int异常。当带有异常规范说明的函数指针被初始化时,当作初值的函数,其异常规范中列出的异常类型数量应不多于函数指针异常规范中列出的异常类型。例如,有如下函数指针声明和赋值语句:

void func1(int) throw(type1, type2, type3);  //本函数可以抛出三种异常
void func2(int) throw(type1);           //本函数可以抛出一种异常
void func3(int) throw();              //本函数不抛出异常
//声明函数指针变量pfun,通过该指针调用的函数可以抛出一种类型的异常
void (*pfun)(int) throw(type1);         
pfun = func1; //错误,func1可以抛三种类型异常,pfun指针要求只能抛出一种异常
pfun = func2; //正确
pfun = func3; //正确

​ 通常,采用异常规范说明时,会将函数可能抛出的异常类型一一列出,但函数也有可能抛出没有出现在异常规格说明中的异常,若出现这种情况,一般编译可以通过,在程序运行过程中识别出该异常后,会执行C++的库函数unexpected(),unexpected()会调用terminate()函数,终止程序。

点击此处
隐藏目录