/* user-defined exception class derived from a standard class for exceptions*/
class MyProblem : public std::exception {
public:
...
MyProblem(...) { //special constructor
}
virtual const char* what() const throw() {
//what() function
...
}
};
...
void f() {
...
//create an exception object and throw it
throw MyProblem(...);
...
}
我的问题是为什么在()之后有一个“const throw()”? 通常,如果有throw(),则表示throw()之前的函数 可以抛出异常。但是,为什么会抛出这个?
答案 0 :(得分:8)
"throw()"
中的空括号表示该函数不会抛出。
答案 1 :(得分:4)
const 是throw()的另一个问题 这表明这是一种const方法。因此,对此方法的调用不会更改对象的状态。
throw()表示该方法不会抛出任何异常。
对于此方法的 USER ,该方法仅通过常规方式返回,您无需担心调用生成异常。
对于该方法的 IMPLEMENTER ,还有更多需要担心的问题 与Java不同,这不是编译时约束,而是运行时约束。如果实现者编写函数以便意外地从方法中抛出异常,那么运行时将停止应用程序死机(没有解除堆栈没有析构函数等)。
但惯例是实施者将采取额外的预防措施来捕捉所有内部异常。
PS 的
您可能希望从std :: runtime_error
(来自Comment@onebyone.livejournal.com):不完全。
无抛出说明符被积极使用。这表明异常安全性表明该方法提供了no throw guarantee
另一方面,不使用其他异常说明符,因为它们太危险了。如果你弄错了它会导致应用程序终止(std :: unexpected)。默认操作是应用程序终止,无需展开堆栈,也无需使用对象析构函数进行清理。在MHOP中,这几乎不可取。
答案 2 :(得分:3)
const
限定函数what()
,表示它不会修改异常对象的内部结构。
throw()
意味着它不会抛出异常 - 正如OneByOne和Checkers所指出的那样。
这两个词在很大程度上是无关的,即使它们在签名中彼此相邻。