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

1、函数的异常规格说明 

问题 

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

 

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

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

 

 异常规格说明的意义 

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

          - 提示函数的维护者不要抛出其它异常 

         -异常规格说明是函数接口的一部分

 

问题 

          如果抛出的异常不在声明列表中, 会发生什么 

 

2、编程实验 

异常规格之外的异常     E2-1.cpp 

#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;
}

g++

VS2015

 

3、函数的异常规格说明 

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

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

可以自定义函数替换默认的unexpected()函数实现 

        注意:不是所有的C++编译器都支持这个标准行为

                              即VS2015没有遵守标准C++的行为

 

unexpected()函数的替换 

       -自定义一个无返回值无参数的函数 

                  能够再次抛出异常 

                             当异常符合触发函数的异常规格说明时,恢复程序执行 

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

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

                  参数类型为void (*) () 

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

4、编程实验 

自定义unexpected()函数      E2-2.cpp 

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

using namespace std;

void my_unexpected()
{
    cout << "void my_unexpected()" << endl;
    // exit(1);
    throw 1;    //兼容触发函数异常规格说明
}

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;
}

g++

VS2015

 

5、小结 

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

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

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

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

      -异常能够匹配,恢复程序的执行 

      -否则,调用terminate()结束程序 

 

猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/81357142