首页 > 代码库 > 外传篇2 函数的异常规格说明

外传篇2 函数的异常规格说明

1. 函数的异常规格说明

(1)C++提供语法用于声明函数所抛出的异常

(2)异常声明作为函数声明的修饰符,写在参数列表后面

//可能抛出任何异常
void func1();

//只能抛出的异常类型:char和int
void func2() throw(char, int);

//不抛出任何异常
void func3() throw();

//自定义结束函数
void my_terminate()

2. 异常规格说明的意义

(1)提示函数调用者必须做好异常处理的准备

(2)提示函数维护者不要抛出其它异常

(3)异常规格说明是函数接口的一部分

3. 异常规格之外的异常

(1)函数抛出的异常不在规格说明中全局unexpected()函数将被调用

(2)默认的unexpected()函数会调用全局的terminate()函数。

(3)可以自定义函数替换默认的unexpected()函数。(注意,不是所有的C++编译器都支持这个标准行为)

【编程实验】抛出的异常不在声明列表中,会发生什么?

#include <iostream>

using namespace std;

//抛出规格说明之外的异常
void func() throw(int)//指明该函数可能抛出一个int型的异常
{
    cout << "func()" << endl;
    
    throw c; //抛出的却是字符型异常!
}

int main()
{
    try
    {
        func();    
    }catch(int){
        cout << "catch(int)" << endl;
    }catch(char){
        cout << "catch(char)" << endl;
    }
    return 0;
}

/*输出结果:
1、g++编译及运行结果
func()
terminate called after throwing an instance of ‘char‘

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application‘s support team for more information.
2、VC++编译及运行结果(Vc可见没遵循标准规范,即调用unexpected)
func()
catch(char)
*/

4. unexpected()函数的替换

(1)自定义一个无返回值无参数的函数(可以再次抛出异常

  ①当异常符合触发函数(即哪个函数触发了异常)的异常规格说明时,恢复程序执行。

  ②否则,调用全局terminate()函数结束程序。

(2)调用set_unexpected()设置自定义的异常函数

  ①参数类型为void(*)()

  ②返回值为默认的unexpected()函数入口地址

【编程实验】自定义unexpected函数

#include <iostream>
#include <cstdlib>
#include <exception>

using namespace std;

void my_unexpected()
{
    cout << "void my_unexpected()" << endl;
    
    //exit(1);
    throw 1; //再次抛出的异常与触发函数(func)声明的中异常规格类型
             //一致,则程序恢复执行,所以会被catch(int)捕获
}

//抛出规格说明之外的异常
void func() throw(int)//指明该函数可能抛出一个int型的异常
{
    cout << "func()" << endl;
    
    throw c; //抛出的却是字符型异常!
}

int main()
{
    set_unexpected(my_unexpected);
    
    try
    {
        func();    
    }catch(int){
        cout << "catch(int)" << endl;
    }catch(char){
        cout << "catch(char)" << endl;
    }
    return 0;
}

/*输出结果:
1、g++和bcc编译及运行结果
func()
void my_unexpected()
catch(int)

2、VC++编译及运行结果(Vc可见没遵循标准C++规范,即调用unexpected)
func()
catch(char)
*/

5. 小结

(1)C++中的函数可以声明异常规格说明

(2)异常规格说明可以看作接口的一部分

(3)函数抛出的异常不在规格说明中unexpected()被调用

(4)unexpected()中能够再次抛出异常

 

外传篇2 函数的异常规格说明