抛出不同种类的异常是有用的吗?

时间:2011-05-23 10:25:19

标签: c++ exception

在大型项目中为实例std::runtime_errorstd::invalid_argument抛出不同的异常是否有用?或者,为std::exception添加一个好的文本参数,为一般what()投票是否更好?什么时候从std::exception得到一些子类?

入魔

4 个答案:

答案 0 :(得分:6)

使用throw最具体的异常总是有意义的。因为每个异常应该从std::exception派生,所以代码捕获可以决定它想要处理它的粒度级别(通过引用捕获!来自S. Meyers的“更有效的C ++”中的第13项)。

仅使用std::exception仅包含一些文字,禁止使用

  • 不必要地限制捕获代码的使用可能性
  • 如果必须根据异常类型执行不同的操作(可以用RTTI以较低的成本实现),捕获代码需要将文本解析为基础逻辑
  • 我无法想到任何可能有益的情况。如果需要,覆盖what()可为任何异常提供足够的文本。

答案 1 :(得分:2)

我会说,拥有一个经过深思熟虑的异常层次结构比仅通过其错误消息区分的单个异常类型更好。这是因为您可以编写如下代码:

try {
    object.method();
}
catch (LogicalException& e) {
    // if it's a LogicalException, handle it here
}
catch (Exception& e) {
    // otherwise, handle a general exception here.
}

其中LogicalException是一个例外。如果你问我的话,以另一种方式编写这样的代码会导致if-else的长串,非常容易出错。

答案 2 :(得分:0)

所有标准C ++异常类都派生自类std::exception。因此,捕获代码可能会捕获std::exception &中的异常或特定clas处理程序中的异常,但抛出特定异常更有意义,以便适当的处理程序可以处理特定异常。

答案 3 :(得分:0)

虽然我原则上同意

  

使用throw最具体的异常总是有意义的

可能有也可能没有必要。

我为一个巨大的项目编写了框架,起初我很想设计所有错误报告系统的母亲 - 它会很漂亮。部分设计是异常类的层次结构。

我把它扔掉了。不是因为它很糟糕,我把它扔了,因为它完全没必要。

我们当然处理了现有的异常,但是不需要多个自定义异常,因为事实证明,我们称之为“程序员”错误的每一个“异常情况”都基本上是失败的断言。

在我们的案例中,最好的解决方案是将面包屑的描述性痕迹记录到文件中然后显示相当于“哎呀,抱歉!”的系统。在下一个适当的空闲状态以及与技术支持的链接。

这是我们的应用程序。也许你正在写一个图书馆,在这种情况下忽略我刚才所说的一切。

所以 - 对不起,这听起来像个警察 - 但问题的答案是:

取决于。