函数异常规范和标准异常 - foo()throw(异常)

Vyk*_*tor 4 c++ exception-handling exception throw

在C++中,您可以使用如下的异常规范声明函数:

int foo() const throw(Exception);
Run Code Online (Sandbox Code Playgroud)

我找到了这两个链接:

但有几件事最终没有答案......

问题1:为什么要添加异常规范?它会带来任何性能提升吗?编译器会有什么不同?因为它对我来说似乎就像程序员的信息.

问题2:如果我扔掉一些不符合规格的东西会发生什么(会发生什么)?例如:

int foo() throw(int) {
        throw char; // Totally unrelated classes, not types in real
}
Run Code Online (Sandbox Code Playgroud)

问题3:函数/方法不应该抛出任何东西.我找到了至少两个(三种,不同编译器的替代语法)方法来指定无异常抛出:

  • int foo() throw();
  • int foo() __attribute(nothrow)__ 对于gcc
  • int foo() nothrow 用于Visual C++

哪一个是"正确的"?有什么区别吗?我应该使用哪一个?

问题4: " 非标准例外" bad_alloc,bad_cast,bad_exception,bad_typeidios_base::failure.

好的bad_alloc是自我解释,我知道如何(更重要的是何时)使用它(添加到异常规范),但其他的呢?他们都没有真正响铃......他们与哪些"代码片段"相关联?喜欢bad_alloc与之相关new char[500000].

问题5:如果我有异常类层次结构,如下所示:

    class ExceptionFileType {
             virtual const char * getError() const = 0;
    };

    class ExceptionFileTypeMissing : public ExceptionFileType {
            virtual const char *getError() cosnt {
                    return "Missing file";
            }
    }
Run Code Online (Sandbox Code Playgroud)

我应该使用:

    int foo() throw(ExceptionFileType);
Run Code Online (Sandbox Code Playgroud)

要么:

    int foo() throw(ExceptionFileTypeMissing,ExceptionFileTypeNotWritable,ExceptionFileTypeNotReadable,...)
Run Code Online (Sandbox Code Playgroud)

注意:带参考的答案会很棒.我正在寻找好的练习技巧.

Jer*_*fin 6

简单的"良好实践"提示是:不要使用异常规范.

基本上唯一的例外是空的异常规范的可能性:throw().这非常有用,在C++ 11中它被赋予了自己的关键字(noexcept).人们普遍认为,任何非空的异常规范都是一个糟糕的想法.

noexcept正式弃用了异常规范(除了)之外 - 与许多弃用的功能不同,删除它会影响到足够少的源代码,我认为它最终有可能最终被删除(当然不能保证,但无论如何都是相当公平的机会) .

至于当/如果你确实抛出异常规范不允许的类型的异常时会发生什么:std::unexpected()被调用.默认情况下,调用terminate().您可以使用std::set_unexpected设置自己的处理程序 - 但您可以合理地做的就是在您之前添加一些日志记录terminate().您的意外处理程序不允许返回.