11

从 C++ 函数声明可能的异常抛出有什么好处?换句话说,添加关键字throw()实际上做了什么?

我读过一个函数声明,例如void do_something() throw();应该保证没有异常来自do_something()函数;但是,这似乎不适用于调用 within 的函数do_something(),因此使其成为一个薄弱的保证。

请概述此语言功能的有用性(和最佳用例)。

4

4 回答 4

21

没有人比萨特更能解释这一点

http://www.ddj.com/architect/184401544

简短的版本是

  1. 永远不要编写异常规范
  2. 除了可能是空的
于 2009-03-04T05:40:45.050 回答
5

C++ 标准要求,unexpected()如果函数试图抛出不在其异常列表中的异常,则调用该函数。MSDN 对此的简短描述如下:http: //msdn.microsoft.com/en-us/library/awbt5tew (VS.80).aspx

大多数编译器实际上并不支持此 C++ 功能。

于 2009-03-04T05:35:51.210 回答
1
void do_something() throw(); 

这是实现者方面的保证,该函数永远不会抛出异常。这就是该功能的客户所期望的。但是,这也意味着函数内部某处生成的任何异常都会得到处理,而不是重新抛出给do_something(). 从内部重新开始的人感到羞耻throw,因为没有什么能阻止他投掷。这是因为,从具有空异常规范的函数中抛出等效于抛出规范中未提及的异常并使其std::unexpected()成为预期的,然后是程序终止。

BTW:强异常保证的普遍接受的定义是:如果公共操作由于某种原因失败,则抛出异常,并且对象的状态保持不变(原子操作)。

于 2009-03-04T05:38:00.113 回答
0

基本上,通过与throw();你一起声明函数告诉编译器你百分百确定该函数不会抛出任何异常,从而允许编译器执行一些优化。如果您的函数无论如何都抛出异常,那么您就有麻烦了,因为它很可能会导致未定义的行为。

于 2009-03-04T05:33:17.877 回答