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)__ 对于gccint foo() nothrow 用于Visual C++哪一个是"正确的"?有什么区别吗?我应该使用哪一个?
问题4: " 非标准例外" bad_alloc,bad_cast,bad_exception,bad_typeid和ios_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)
注意:带参考的答案会很棒.我正在寻找好的练习技巧.
简单的"良好实践"提示是:不要使用异常规范.
基本上唯一的例外是空的异常规范的可能性:throw().这非常有用,在C++ 11中它被赋予了自己的关键字(noexcept).人们普遍认为,任何非空的异常规范都是一个糟糕的想法.
noexcept正式弃用了异常规范(除了)之外 - 与许多弃用的功能不同,删除它会影响到足够少的源代码,我认为它最终有可能最终被删除(当然不能保证,但无论如何都是相当公平的机会) .
至于当/如果你确实抛出异常规范不允许的类型的异常时会发生什么:std::unexpected()被调用.默认情况下,调用terminate().您可以使用std::set_unexpected设置自己的处理程序 - 但您可以合理地做的就是在您之前添加一些日志记录terminate().您的意外处理程序不允许返回.