4

我有一个不抛出任何东西的成员函数,所以我在throw()它的末尾附加了后缀,表示它不会抛出任何异常。

我的问题是,在函数中我使用了几个std::string,让我们说在初始化时出了点问题std::string,它抛出bad_allocor out_of_range(或者 std::string 可能出现的其他问题)。

仍然添加throw()后缀是否仍然安全?

4

3 回答 3

4

赫伯萨特_

异常规范带来的好处远远少于其价值

它带来的问题多于带来的好处。所以,你应该在这样做之前三思而后行。

于 2012-04-21T17:38:30.197 回答
2

异常规范对在函数内部运行的所有代码做出了承诺,无论您是否编写了它。

如果std::string从你的函数内部抛出,那么这个承诺就会被打破,你的程序就会失败。(std::unexpected异常,这通常意味着您的程序很难终止)

throw()规范仅在以下情况下是正确的:

  • 您的函数所做的任何事情都不会抛出,即使是间接的

或者

  • 您的函数捕获所有此类异常并正常退出(不重新抛出)。
于 2012-04-21T17:33:53.973 回答
2

两件事情。

首先:throw()规范添加了一个运行时检查,该函数不会抛出异常,std::unexpected_exception如果 promise 被破坏则调用,这将终止程序。

第二:throw()不建议使用,并且已在 C++11 中弃用。在 C++11 中,您可以noexcept改用(或更具延展性的形式noexcept(boolean-expression))。不创建运行时检查,如果函数抛出,行为是未定义的。

于 2012-04-21T17:37:09.557 回答