有人能解释C ++中使用的异常规范吗?
答案 0 :(得分:15)
什么时候使用(我很少看到它在代码中使用)
希望永远不会因为明年的标准化而在下一版C ++中被弃用。
使用例外规范有哪些优缺点(优点/缺点)?
它们为代码的读者提供了一种方法,可以准确地知道函数允许抛出的异常。问题是,如果抛出了意外的异常(不在规范中),那么程序将被终止(默认情况下)。
答案 1 :(得分:13)
他们通常被认为是一个坏主意。
他们说一个方法会抛出什么。缺点是,如果该方法抛出其他任何东西,那么您的应用程序将终止。所以它是一种保证,但与Java不同。它增加了检查的开销。
答案 2 :(得分:6)
重要的是要知道:在C ++的下一个版本中不推荐使用异常规范,除了no-throw说明符(throw()
),它基本上正式说“不要使用它们”。< / p>
在函数之后放置throw()
意味着该函数不会抛出任何异常。如果它仍然存在,应用程序将被终止(可能 - 调用意外的处理程序),因此应用程序的其余部分可以使用该函数,因为它知道它不会抛出异常。这对于编写异常安全的代码非常方便。
示例:
void MyFunction() throw() // does not throw any exceptions
{
/* ... */
{
答案 3 :(得分:2)
它们向程序员指示将从该函数抛出哪些异常。它们的优点是您可以保证不会从该函数抛出其他异常。但是,没有编译时检查函数是否实际抛出除了throw说明符中指示的异常之外的任何异常。相反,它在运行时检查。如果失败,则调用unexpected()
,默认情况下会调用abort()
,默认情况下会终止您的程序。所以,除非你真的希望你的程序在你搞砸并且意外异常被抛出时死掉,否则使用它们可能是个坏主意。
我实际建议使用它们的地方是析构函数。如果析构函数抛出,它真的坏。他们应该从不投掷。因此,如果你在析构函数上使用throw()
来指示它不能抛出异常,那么你就会知道你的程序会死掉而不是继续处于从抛出异常后它将处于的错误状态。析构函数。
无论如何,如果你使用任何类型的throw说明符,你必须确保你真的希望你的程序在被违反时死掉。所以,一般来说,最好不要使用它们。
答案 4 :(得分:-3)
基本上,异常规范允许编译器优化堆栈。缺点是这是一个很多额外规格的地狱。这意味着您通常在图书馆工作中看到它,而不是在工作代码中看到它。
我相信还有一些编译时异常安全问题正在发生,但由于我从未使用它,我无法确定。