与派生标准异常类相关的问题

A question related to deriving standard exception classes

提问人:MainID 提问时间:1/31/2009 最后编辑:IgorMainID 更新时间:2/3/2009 访问量:358

问:

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

C++ 异常

评论


答:

8赞 Alex B 1/31/2009 #1

空大括号表示函数不会抛出。"throw()"

评论

0赞 Alex B 2/2/2009
也许,“不应该扔”。
0赞 Richard Corden 2/2/2009
最好将其表述为:“例外不会在该函数之外传播”。如果从该函数中引发异常,您的程序可能会“终止”,但不会传播。
3赞 Jonathan Leffler 2/1/2009 #2

限定函数,表示它不修改异常对象的内部结构。constwhat()

这意味着它也不会抛出异常 - 正如 OneByOne 和 Checkers 所指出的那样。throw()

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

4赞 Martin York 2/1/2009 #3

const 是 throw() 的一个单独问题。
这表明这是一个 const 方法。因此,对此方法的调用不会更改对象的状态。

throw() 表示该方法不会抛出任何异常。

对于该方法的 USER 来说,该方法只会通过正常方式返回,您无需担心调用产生异常。

对于该方法的实施者来说,还有更多需要担心的。
与 Java 不同,这不是编译时约束,而是运行时约束。如果实现者编写函数时意外地从方法中抛出异常,则运行时将停止应用程序死机(没有堆栈的展开,没有析构函数等)。

但惯例是,实施者将采取额外的预防措施来捕获所有内部异常。

PS
您可能想从 std::runtime_error 派生

(来自 [email protected]):不完全是。
主动使用 no throw 说明符。这是异常安全性的指示,表明该方法提供了不抛出保证

另一方面,不使用其他异常说明符,因为它们太危险了。如果您弄错了它们,则会导致应用程序通过 (std::unexpected) 终止。默认操作是应用程序终止,而不展开堆栈,也不使用对象析构函数进行清理。在MHOP中,这几乎是不可取的。

评论

0赞 Martin York 2/2/2009
@onebyone.livejournal.com:排队回答