3

我知道这是一个有效的 c++ 程序。函数声明中的 throw 有什么意义?AFAIK 它什么也不做,也不用于任何事情。

#include <exception>
void func() throw(std::exception) { }
int main() { return 0; }
4

6 回答 6

18

它指定任何东西std::exception都可以从 中抛出func(),没有别的。如果抛出其他东西,它将调用一个unexpected()默认调用的函数terminate()

这意味着抛出其他东西几乎肯定会终止程序,就像未捕获的异常一样,但实现必须强制执行。try{...}catch(){...}这通常与在 周围放置一个块大致相同func(),这会抑制性能。

通常,异常规范是不值得的,根据本周的 Guru专栏。Boost 指南说,对于throws()非内联函数,空白可能有一点好处,但也有缺点。

于 2009-10-19T15:49:43.153 回答
12

这是一个异常规范,几乎可以肯定是个坏主意

它声明func可能会抛出std::exception,并且任何其他func发出的异常都将导致调用unexpected()

于 2009-10-19T15:47:47.910 回答
2

这是一个 C++ 异常规范。它声明特定函数可能会抛出一个std::exception类型。

通常,尽管 C++ 中的异常规范被认为是要避免的特性。这是一个奇怪的特性,它的行为是在编译时声明的,但只在运行时检查(与 Java 的版本非常不同)。

这是一篇很好的文章,它分解了这个功能

于 2009-10-19T15:48:56.663 回答
0

这是一个异常规范。它说 func() 可以抛出的唯一异常是 std::exception (或其派生词)。尝试抛出任何其他异常将给出 std::unexpected 。

于 2009-10-19T15:46:35.277 回答
0

异常规范。关键字后面的类型throw准确地指定了函数可以抛出的所有异常(如果有的话)。见草案 15.4。

注意:没有异常规范的函数允许所有异常。具有空异常规范的函数 ,throw()不允许任何异常。

于 2009-10-19T15:47:58.647 回答
0

基本上是这样的:

void func() throw(std::exception,B) {  /* Do Stuff */}

只是这个的简写:

void func()
{
    try
    {
        /* Do Stuff */ 
    }
    catch(std::exception const& e)
    {
        throw;
    }
    catch(B const& e)
    {
        throw;
    }
    catch(...)
    {
        unexpected();  // This calls terminate
                       // i.e. It never returns.
    }
}

调用 terminate() 很少是您想要的,因为堆栈没有展开,因此您在 RAII 中的所有努力都被浪费了。该规则的唯一例外是声明一个空的抛出列表,这主要是为了说明您支持无抛出异常保证(在这种情况下您仍应手动捕获所有异常)。

一些重要的(恕我直言)不应该抛出的地方是析构函数和 swap() 方法。析构函数很少被显式标记为 no-throw,但 swap() 经常被标记为 no-throw。

void myNoThrowFunc() throws()  // No-Throw (Mainlly for doc purposes).
{
    try
    {
        /* Do Stuff */
    }
    catch(...)  // Make sure it does not throw.
    {
        /* Log and/or do cleanup */
    }
}
于 2009-10-19T17:14:01.167 回答