异常规范与异常处理

时间:2013-07-16 17:06:13

标签: c++ exception

我们在4和最后的C ++类中,我一直在查看Herb Sutter关于异常规范的帖子和stackoverflow上的一些帖子,表明在下一版C ++中将不推荐使用异常规范。

我可以找到如何实现异常规范的示例,但是我在理解异常规范以及它们与异常处理的区别方面存在一些问题。

提供一些见解的任何帮助都将是最有帮助的。

3 个答案:

答案 0 :(得分:5)

异常规范要求编译器通过调用std::unexpected()或使用std::set_unexpected()的替换集来处理所有未列出的异常类型。

他们被普遍认为是一件坏事。

常见的误解:

  • “编译器会检查你是否做了任何可能引发其他异常的事情。”假。在编译时不检查C ++异常。编译器不检查是否抛出其他类型,并且不检查是否忘记处理未列出的异常类型。
  • “你不能抛出其他类型的异常。”错误,在函数内可以抛出任何异常。在运行时,如果函数将通过任何未列出的异常类型异常终止,则将调用意外的处理程序,该处理程序有机会用列出的类型替换该异常。

另见std::bad_exception

答案 1 :(得分:3)

异常规范指定函数可能抛出的异常。

答案 2 :(得分:1)

正如名称所暗示的,异常规范是关于指定函数可能抛出的异常;一般来说。 可能的实施方式取决于语言。

  • 在Java中,编译器静态强制执行此操作,并且如果您的函数可能抛出其他东西(除非其他东西派生自特定的基本异常类),它将拒绝该程序。
  • 在C ++中,编译器允许程序,但它会插入运行时检查,如果有任何未指定的内容,则调用std::unexpected

一般来说,异常规范几乎普遍受到谴责,因为:

  • 他们写得不好。如果你调用两个函数抛出一组X和Y的异常,那么结果函数应该至少声明X和Y的并集。由于它很快变得难以管理,你需要“翻译”异常进入某些常见类型,包裹在原始类型以保持上下文。结束3或5个深度异常链并不罕见。
  • 可能会抛出一些基本操作。在C ++中,内存分配可能会抛出std::bad_alloc;因此,每个STL集合都很容易受到影响。

如果可能的话,忘了你曾经学过异常规范。