提问人:MainID 提问时间:1/31/2009 最后编辑:IgorMainID 更新时间:2/3/2009 访问量:358
与派生标准异常类相关的问题
A question related to deriving standard exception classes
问:
/* 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(...);
...
}
我的问题是为什么在what()之后有一个“const throw()”? 通常,如果有一个 throw() ,则意味着 throw() 之前的函数 可以抛出异常。但是,为什么这里会有投掷?
答:
空大括号表示函数不会抛出。"throw()"
评论
限定函数,表示它不修改异常对象的内部结构。const
what()
这意味着它也不会抛出异常 - 正如 OneByOne 和 Checkers 所指出的那样。throw()
这两个词在很大程度上是无关的,即使它们在签名中彼此相邻。
const 是 throw() 的一个单独问题。
这表明这是一个 const 方法。因此,对此方法的调用不会更改对象的状态。
throw() 表示该方法不会抛出任何异常。
对于该方法的 USER 来说,该方法只会通过正常方式返回,您无需担心调用产生异常。
对于该方法的实施者来说,还有更多需要担心的。
与 Java 不同,这不是编译时约束,而是运行时约束。如果实现者编写函数时意外地从方法中抛出异常,则运行时将停止应用程序死机(没有堆栈的展开,没有析构函数等)。
但惯例是,实施者将采取额外的预防措施来捕获所有内部异常。
PS
您可能想从 std::runtime_error 派生
(来自 [email protected]):不完全是。
主动使用 no throw 说明符。这是异常安全性的指示,表明该方法提供了不抛出保证
另一方面,不使用其他异常说明符,因为它们太危险了。如果您弄错了它们,则会导致应用程序通过 (std::unexpected) 终止。默认操作是应用程序终止,而不展开堆栈,也不使用对象析构函数进行清理。在MHOP中,这几乎是不可取的。
评论