成都网站建设设计

将想法与焦点和您一起共享

函数的异常规格说明(五十九)-创新互联

    我们在进行异常分析的时候,如何判断一个函数是否会抛出异常,以及抛出哪些异常呢?C++ 提供语法用于声明函数所抛出的异常,异常声明作为函数声明的修饰符,写在参数列表后面。如下

泗洪ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

函数的异常规格说明(五十九)

        函数异常规格说明的意义是:a> 提供商函数调用者必须做好异常处理的准备;b> 提供函数的维护者不要抛出其他异常;c> 异常规格说明是函数接口的一部分。那么如果抛出的异常不在声明列表中会发生什么?

        下面我们还是以代码为例来进行说明

#include 

using namespace std;

void func() throw(int)
{
    cout << "func()" << endl;
    
    throw 'c';
}

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

        我们在 func 函数的后面只声明有可能会抛出 int 类型的异常,实际我们抛出的是字符型异常,我们来看看在 main 函数中的 catch(char) 语句块能捕获到吗?先来看看 g++ 编译器下是怎样的


函数的异常规格说明(五十九)

        运行的结果是没有捕获到 char 类型的异常,调用了 Aborted 函数。我们再用 BCC 编译器试试

函数的异常规格说明(五十九)

        我们再来试试 vs2010 编译器

函数的异常规格说明(五十九)

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

        下来我们来说说 unexpected() 函数的替换:a> 自定义一个无返回值参数的函数,能够再次抛出异常。当异常符合触发函数的异常规格说明时,恢复程序执行。否则,调用全局 terminate() 函数结束程序;b> 调用 set_unexpected() 设置自定义的异常函数,参数类型为 void(*)(),返回值为默认的 unexpected() 函数入口地址。

        我们来看看自定义 unexpected() 函数的代码是怎么写的

#include 
#include 
#include 

using namespace std;

void my_unexpected()
{
    cout << "void my_unexpected()" << endl;
    
    throw 1;
}

void func() throw(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;
}

        我们先来分析下,在 func 函数中声明的异常是 int 类型的,但是抛出的 char 类型的。因此编译器会调用我们设置的 my_unexpected() 函数,在 my_unexpected() 中又抛出了一个 int 类型的异常,因此便会被 main 函数中的 catch(int) 捕获到,输出 catch(int) 语句。我们来看看在 g++ 编译器中是怎样的

函数的异常规格说明(五十九)

        跟我们分析的是一致的,再来看看 vs2010 编译器是怎样的

函数的异常规格说明(五十九)

        它还是我行我素,没一点变化。这便是我们之前说的不是所有的 C++ 编译器都支持这个标准行为。通过对异常规格说明的学习,总结如下:1、C++ 中的函数可以声明异常规格说明,异常规格说明可以看做接口的一部分;2、函数抛出的异常不在规格说明中,unexpected() 被调用;3、unexpected() 中能够再次抛出异常:异常能够匹配则恢复程序的执行,否则调用 terminate() 结束程序。

        欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享题目:函数的异常规格说明(五十九)-创新互联
文章位置:http://chengdu.cdxwcx.cn/article/cchdoh.html