C++中的throw修饰符有什么用处吗?

15
我已经开始统一使用C++异常了,现在我想让编译器(g++)检查是否存在"异常泄漏"。像 const 修饰类方法的常数性那样,throw 修饰应该可以实现这一点。
然而,它并没有做到。
使用 throw仍然只是文档上的说明,但如果其他人认为函数不能抛出除文档中列出的异常之外的任何异常,可能会非常具有误导性甚至危险。
能否通过某种方式说服 g++ 更加严格地检查 throw,确保以 throw() 修饰的函数永远不会抛出任何异常呢?
编辑:发现此问题广泛处理了这个主题。

类似的问题在这里:https://dev59.com/SnNA5IYBdhLWcg3wPbWe - Glen
4个回答

17

它不会在编译时检查,但符合规范的编译器应该在运行时确保它。

如果一个函数抛出其 throw-declaration 之外的任何异常,C++ 运行时应该调用 std::unexpected,如果我没记错的话。


这也是我的理解。为什么你想要它这样做我不知道。个人而言,我发现 GetFoo() // throws(std::runtime_error) 比没有注释的等价物更有用 - 只是作为对我的代码使用者的提示。 - Dominic Rodger
1
正确。编译时检查的实际问题是大多数现有的C++代码没有抛出规范。 - MSalters
8
Visual C++ 2008不支持标准的这部分内容。 - Kirill V. Lyadvinsky
@Kirill:有趣,我不知道那个。 - Kim Gräsman
1
更新:就我所看到的,VS 2012仍不支持标准的那部分。 - Mark McKenna

8

我建议你也看一下这篇文章,它谈到了关于异常规格的问题,例如:

  • 它是一个影子类型系统
  • 编译器只在运行时检查抛出的异常
  • 在抛出但未指定异常情况下的默认行为通常无法使用并且经常被程序员误解

2
基本上,异常规范只有作为空异常规范时才有用。否则,我认为它们是一个失败的实验。请参见phlipsy的回答了解原因。

0

我不知道检查器/编译器是否能够做到这一点。也许在函数声明中注释它会更容易。虽然这并不是绝对可靠的,但如果人们看到可能会抛出异常,大多数人都会将函数调用包装在try和catch中。

//Can throw Exception
GetFoo();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接