【问题标题】:A question related to deriving standard exception classes关于派生标准异常类的问题
【发布时间】:2010-10-04 16:07:46
【问题描述】:
/* 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++ exception


    【解决方案1】:

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

    【讨论】:

    • 也许,“不应该扔”。
    • 最好将其表述为:“异常不会传播到该函数之外”。如果从该函数中抛出异常,您的程序可能会“终止”,但不会传播。
    【解决方案2】:

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

    throw() 表示它也不会引发异常 - 正如 OneByOne 和 Checkers 所指出的那样。

    这两个词在很大程度上是不相关的,即使它们在签名中紧挨着出现。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      PS
      您可能希望从 std::runtime_error 派生

      (来自 Comment@onebyone.livejournal.com):不完全是。
      no throw 说明符被积极使用。这是异常安全的一个指示,表明该方法提供了no throw guarantee

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

      【讨论】:

      • @onebyone.livejournal.com:在线回答
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多