与导出标准异常类相关的问题

时间:2009-01-31 13:31:56

标签: c++ exception

/* 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()之前的函数   可以抛出异常。但是,为什么会抛出这个?

3 个答案:

答案 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所指出的那样。

这两个词在很大程度上是无关的,即使它们在签名中彼此相邻。