分享

C ++ 函数后面加throw()的作用

 拨开云雾见天日 2010-10-08

void foo() throw (int);      // 只能抛出int型异常
void bar() throw ();         // 不抛出任何异常
void baz();                  // 可以抛出任意类型的异常或者不抛出异常

如果一个函数的声明中带有throw限定符,则在函数体中也必须同样出现:

void foo() throw (int)
{
    ...
}

这里有一个问题,非常隐蔽,就是即使你象上面一样编写了foo()函数,指定它只能抛出int异常,而实际上它还是可能抛出其他类型的异常而不被编译器发现:

void foo() throw (int)
{
    throw float;     // 错误!异常类型错误!会被编译器指出
    ...
    baz();           // 正确!baz()可能抛出非int异常而编译器又不能发现!
}

void baz()
{
    throw float;
}

这种情况的直接后果就是如果baz()抛出了异常,而调用foo()的代码又严格遵守foo()的声明来编写,那么程序将abort()。这曾经让我很恼火,认为这种机制形同虚设,但是还是有些解决的办法,请参照“使用技巧”中相关的问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多