我知道这是一个有效的c ++程序。 函数声明中抛出的重点是什么? AFAIK它没有做什么,也没有用于任何事情。
#include <exception>
void func() throw(std::exception) { }
int main() { return 0; }
答案 0 :(得分:18)
它指定可以从std::exception
抛出任何func()
,而不是其他任何内容。如果抛出其他内容,它将调用unexpected()
函数,该函数默认调用terminate()
。
这意味着抛出其他内容几乎肯定会以与未捕获的异常相同的方式终止程序,但实现必须强制执行此操作。这通常与在try{...}catch(){...}
周围放置func()
块非常相似,这会阻碍性能。
根据the Guru of the Week专栏,通常情况下,异常规范不值得。 Boost guidelines表示非内联函数空白throws()
可能会有一些好处,但也存在缺点。
答案 1 :(得分:12)
这是一个异常规范,几乎可以肯定是bad idea。
它声明func
可能会抛出std::exception
,而func
发出的任何其他异常都会导致对unexpected()
的调用。
答案 2 :(得分:2)
这是一个C ++异常规范。它声明特定函数可能会抛出std::exception
类型。
通常,虽然C ++中的异常规范被认为是要避免的功能。这是一个奇怪的特性,它的行为是在编译时声明的,但只在运行时检查(与Java的版本非常不同)。
这是一篇很好的文章,分解了这个功能
答案 3 :(得分:0)
这是一个例外规范。它说func()可以抛出的唯一例外是std :: exception(或其衍生物)。试图抛出任何其他异常会给std :: unexpected。
答案 4 :(得分:0)
异常规范。 throw
关键字后面的类型确切地指定了函数可以抛出的所有异常(如果有的话)。见草案15.4。
注意:没有异常规范的函数允许所有异常。具有空异常规范throw()
的函数不允许任何异常。
答案 5 :(得分: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中的所有努力都被浪费了。规则的唯一例外是声明一个空的列表,这主要是出于文档目的,表明你支持无抛出异常保证(在这种情况下你仍应手动捕获所有异常)。
一些重要的(imho)应该是无抛出的地方是析构函数和swap()方法。析构函数很少被明确标记为无抛出,但swap()通常被标记为无抛出。
void myNoThrowFunc() throws() // No-Throw (Mainlly for doc purposes).
{
try
{
/* Do Stuff */
}
catch(...) // Make sure it does not throw.
{
/* Log and/or do cleanup */
}
}