我知道这是一个有效的 c++ 程序。函数声明中的 throw 有什么意义?AFAIK 它什么也不做,也不用于任何事情。
#include <exception>
void func() throw(std::exception) { }
int main() { return 0; }
这是一个异常规范,几乎可以肯定是个坏主意。
它声明func
可能会抛出std::exception
,并且任何其他func
发出的异常都将导致调用unexpected()
。
这是一个 C++ 异常规范。它声明特定函数可能会抛出一个std::exception
类型。
通常,尽管 C++ 中的异常规范被认为是要避免的特性。这是一个奇怪的特性,它的行为是在编译时声明的,但只在运行时检查(与 Java 的版本非常不同)。
这是一篇很好的文章,它分解了这个功能
这是一个异常规范。它说 func() 可以抛出的唯一异常是 std::exception (或其派生词)。尝试抛出任何其他异常将给出 std::unexpected 。
异常规范。关键字后面的类型throw
准确地指定了函数可以抛出的所有异常(如果有的话)。见草案 15.4。
注意:没有异常规范的函数允许所有异常。具有空异常规范的函数 ,throw()
不允许任何异常。
基本上是这样的:
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 */
}
}