【问题标题】:When throwing different kinds of exceptions is useful?什么时候抛出不同类型的异常有用?
【发布时间】:2011-08-31 01:20:20
【问题描述】:

在大型项目中抛出不同的异常是否有用,例如 std::runtime_errorstd::invalid_argument?还是将std::exceptionwhat() 的良好文本参数一起抛出更好?从std::exception派生一些子类什么时候有意义?

谣言

【问题讨论】:

标签: c++ exception


【解决方案1】:

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

只使用 std::exception 和一些文本是禁止的:

  • 不必要地限制捕获代码的使用可能性
  • 捕获代码需要解析文本以根据异常类型执行不同操作的基础逻辑(使用 RTTI 可以以更低的成本实现)
  • 我想不出这样做会有什么好处。如果需要,覆盖 what() 可为任何异常提供足够的文本。

【讨论】:

    【解决方案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,如果你问我的话,很容易出错。

    【讨论】:

    • c++中通过引用捕获异常(切片问题等)
    • @jdehaan 是的,我以为我们在谈论一般性,而不是特定于 C++。
    【解决方案3】:

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

    【讨论】:

    • 我不确定您所说的“所有例外”是什么意思。在 C++ 中,您可以抛出一个不是从任何基类或基本类型的值派生的类对象。 IE。 throw 2; 是一个有效的构造。
    • @jszpilewski:我的意思是所有标准的 C++ 异常类,而不是用户定义的类。
    【解决方案4】:

    虽然我原则上同意

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

    可能需要也可能不需要。

    我为一个大型项目编写了框架,起初我全神贯注于设计所有错误报告系统之母——它会很漂亮。设计的一部分是异常类的层次结构。

    然后我把它全部扔掉了。不是因为它不好,我把它扔掉了,因为它完全没有必要。

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

    在我们的案例中,最好的解决方案是一个系统,该系统将面包屑的描述性跟踪记录到文件中,然后显示相当于“哎呀,对不起!”的内容。在下一个适当的空闲状态以及指向技术支持的链接。

    那是我们的应用程序。也许您正在编写一个库,在这种情况下,请忽略我刚才所说的一切。

    所以——抱歉,这听起来像是在逃避——但你的问题的答案是:

    视情况而定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多