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

问题:如何判断一个函数是否会抛出异常,以及抛出哪些异常?

c++提供语法用于声明函数所抛出的异常,异常声明作为函数声明的修饰符,写在参数列表后面

/* 可能抛出的任何异常*/

void func1();

/* 只能抛出的异常类型:char和int */

void func2()throw(char,int);

/* 不抛出任何异常 */

void func3() throw();

函数规格说明的意义:提示函数调用者必须做好异常处理的准备,提示函数的维护者不要抛出其他异常,异常规格说明是函数接口的一部分。

问题:如果抛出的异常不在声明列表中,回复发生什么?

#include <iostream>
using namespace std;
void func() throw(int)
{
    cout << "func()";
    cout << endl;    
    throw 'c';

}

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

函数抛出的异常不在规格说明中,全局unexpected()被调用,默认的unexpected()函数会调用全局的terminate()函数,可以自定义函数替换默认的unexpected()函数实现,注意:不是所有的c++编译器都支持这个标准行为。

unexpected()函数的替换:

自定义一个无返回值无参数的函数,能够再次抛出异常,当异常符合触发函数的异常规格说明时,恢复程序执行,否则,调用全局terminate()函数结束程序。

调用set_unexpexted()设置自定义的异常函数,参数类型为函数指针void(*)(),返回值为默认的unexpected()函数入口地址。

#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;
void my_unexpected()
{
    cout << "void my_unexpected()" << endl;
    // exit(1);  不退出,扔出一
    throw 1;  //兼容了触发函数的异常说明,程序正常执行,相当于func扔的为int
}
void func() throw(int)
{
    cout << "func()";
    cout << endl;    
    throw 'c';
}

int main()
{
    set_unexpected(my_unexpected);    //首先不执行他
    try 
    {
        func(); //触发函数
    } 
    catch(int) 
    {
        cout << "catch(int)";
        cout << endl;
    } 
    catch(char) 
    {
        cout << "catch(char)";
        cout << endl;
    }
    return 0;

}

编译器和编译器有差异,c++中的函数可以声明异常规格说明,异常规格说明可以看做接口的一部分,函数抛出的异常不在规格说明中,unexpected()被调用,unexpected()中能够再次抛出异常,异常能够匹配,恢复程序执行,否则,调用terminate()结束程序。

猜你喜欢

转载自blog.csdn.net/ws857707645/article/details/80302163