为了账号安全,请及时绑定邮箱和手机立即绑定

在函数签名中抛出关键字

在函数签名中抛出关键字

C++
倚天杖 2019-11-08 14:19:03
throw在函数签名中使用C ++ 关键字被认为是不好的做法的技术原因是什么?bool some_func() throw(myExc){  ...  if (problem_occurred)   {    throw myExc("problem occurred");  }  ...}
查看完整描述

3 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

Jalf已经链接了它,但是GOTW很好地说明了为什么异常规范没有人们希望的有用:


int Gunc() throw();    // will throw nothing (?)

int Hunc() throw(A,B); // can only throw A or B (?)

评论正确吗?不完全的。Gunc()可能确实会丢东西,并且Hunc()可能会丢掉A或B以外的东西!编译器只是保证在它们发生错误时击败它们……哦,并且在大多数情况下也使您的程序失去意义。


这就是它的最终结果,您可能最终会调用,terminate()并且您的程序死于快速但痛苦的死亡。


GOTW的结论是:


因此,这似乎是我们作为一个社区迄今为止所获得的最佳建议:


道德准则1:永远不要编写异常规范。

道德2:可能是空的,但如果我是你,我什至会避免。


查看完整回答
反对 回复 2019-11-08
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

要为该问题的所有其他答案增加更多的价值,您应该在该问题上花费几分钟:以下代码的输出是什么?


#include <iostream>

void throw_exception() throw(const char *)

{

    throw 10;

}

void my_unexpected(){

    std::cout << "well - this was unexpected" << std::endl;

}

int main(int argc, char **argv){

    std::set_unexpected(my_unexpected);

    try{

        throw_exception();

    }catch(int x){

        std::cout << "catch int: " << x << std::endl;

    }catch(...){

        std::cout << "catch ..." << std::endl;

    }

}

答:如前所述这里,程序调用std::terminate(),因此没有任何异常处理程序将被调用。


详细信息:my_unexpected()调用了第一个 函数,但是由于它没有为throw_exception()函数原型重新抛出匹配的异常类型,因此最后std::terminate()调用了。因此完整的输出如下所示:


user @ user:〜/ tmp $ g ++ -oexcept.testexcept.test.cpp

user @ user:〜/ tmp $。/ except.test

很好-这是

在抛出'int'

中止实例后意外终止倾销)


查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 423 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信