在包含std::string的函数上使用throw()后缀是否安全?

4
我有一个成员函数,它不会抛出任何异常,因此我在其末尾添加了throw()后缀,表示它不会抛出任何异常。
我的问题是,在这个函数中,我使用了几个std::string,假设在初始化std::string时出现了问题,它会抛出bad_allocout_of_range(或其他可能出现的std::string问题)。
那么,仍然可以安全地添加throw()后缀吗?

可能是C++中throw()的重复问题 - Troubadour
3个回答

4

Herb Sutter

异常规范的好处远不如它们所值得的那么多。

它可能会带来更多问题而非好处,因此在执行此操作之前应三思而后行。


2
异常规范针对函数内运行的所有代码做出承诺,无论你是否编写了它。
如果 std::string 在函数内抛出异常,则该承诺被打破,程序失败。(std::unexpected 异常,通常意味着程序强制终止)
只有在以下情况下,throw() 才是适当的:
  • 您的函数不会抛出任何异常,即使间接引起也不会。
或者
  • 您的函数捕获所有这些异常并正常退出(不会重新抛出)。

2

两件事情。

首先:throw()规范添加了运行时检查,确保函数不会抛出异常,如果承诺被打破,则调用std::unexpected_exception,程序将终止。

其次:throw()不建议使用,在C++11中已经被弃用。在C++11中,您可以使用noexcept代替(或更灵活的形式noexcept(boolean-expression))。不会创建运行时检查,如果函数抛出异常,则行为未定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接