C ++ throw装饰有什么用吗?

时间:2009-09-11 10:46:41

标签: c++ exception

我开始以统一的方式使用C ++异常,现在我希望编译器(g ++)检查没有“异常泄漏”。 throw装饰应该这样做,就像const对类方法的常量一样。

嗯,事实并非如此。

使用throw仍然是纪录片,但如果其他人认为函数不能抛出其文档中列出的其他异常,则可能会产生危险的误导。

g ++可以在某种程度上被说服对其抛出检查更加严格,即真正确保装饰为throw()的函数永远不会抛出任何东西。

编辑: 找到this question广泛处理该主题。

4 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:8)

我还建议您查看关于异常规范的this文章。它指出了这个C ++特性的问题,如:

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

答案 2 :(得分:2)

基本上,异常规范仅作为空异常规范。否则我认为他们是一个失败的实验。见phlipsy's answer为什么。

答案 3 :(得分:0)

我不知道检查器/编译器是否可以这样做。也许在函数声明中对它进行注释会更容易。好吧,它不是傻瓜证明,但如果人们看到可能会抛出一个异常,大多数人会在try和catch中包装函数调用。

//Can throw Exception
GetFoo();