【发布时间】:2012-03-14 03:52:06
【问题描述】:
在 C++ 中,您可以像这样声明带有异常规范的函数:
int foo() const throw(Exception);
我找到了这两个链接:
- http://www.cplusplus.com/doc/tutorial/exceptions/ 和
- http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr156.htm
但有几件事最终没有得到答复......
问题一:为什么要添加异常规范?它会带来任何性能提升吗?编译器会有什么不同?因为它对我来说似乎只是程序员的信息。
问题 2:如果我抛出不符合规范的东西会发生什么(应该发生什么)?例如:
int foo() throw(int) {
throw char; // Totally unrelated classes, not types in real
}
问题 3: 函数/方法不应该抛出任何东西。我发现了至少两种(三种,不同编译器的替代语法)方法来指定不抛出异常:
int foo() throw();-
int foo() __attribute(nothrow)__用于 gcc -
int 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";
}
}
我应该使用:
int foo() throw(ExceptionFileType);
或者:
int foo() throw(ExceptionFileTypeMissing,ExceptionFileTypeNotWritable,ExceptionFileTypeNotReadable,...)
注意:有参考的答案会很棒。我正在寻找好的练习技巧。
【问题讨论】:
-
不要使用异常规范,它们在 C++11 中无用且已弃用。其中唯一有用的部分是
throw(),在 11 中已被noexcept取代。
标签: c++ exception exception-handling throw