【发布时间】:2011-08-31 01:20:20
【问题描述】:
在大型项目中抛出不同的异常是否有用,例如 std::runtime_error 或 std::invalid_argument?还是将std::exception 与what() 的良好文本参数一起抛出更好?从std::exception派生一些子类什么时候有意义?
谣言
【问题讨论】:
在大型项目中抛出不同的异常是否有用,例如 std::runtime_error 或 std::invalid_argument?还是将std::exception 与what() 的良好文本参数一起抛出更好?从std::exception派生一些子类什么时候有意义?
谣言
【问题讨论】:
使用 throw 最具体的异常总是有意义的。由于每个异常都应该从std::exception 派生,因此代码捕获可能会决定要在哪个粒度级别处理它(通过引用捕获!S. Meyers 的“更有效的 C++”中的第 13 项)。
只使用 std::exception 和一些文本是禁止的:
what() 可为任何异常提供足够的文本。【讨论】:
我会说,拥有一个经过深思熟虑的异常层次结构比只有一个异常类型(通过其错误消息来区分)要好。这是因为您可以编写如下代码:
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++ 异常类都派生自类 std::exception。因此,捕获代码可能会捕获std::exception & 中的异常或使用特定的 clas 处理程序,但抛出特定异常更有意义,以便适当的处理程序可以处理特定异常。
【讨论】:
throw 2; 是一个有效的构造。
虽然我原则上同意
使用 throw 最具体的异常总是有意义的
可能需要也可能不需要。
我为一个大型项目编写了框架,起初我全神贯注于设计所有错误报告系统之母——它会很漂亮。设计的一部分是异常类的层次结构。
然后我把它全部扔掉了。不是因为它不好,我把它扔掉了,因为它完全没有必要。
我们当然处理了现有的异常,但不需要多个自定义异常,因为事实证明,我们的每一个“异常情况”都是我所说的“程序员”错误,本质上是失败断言。
在我们的案例中,最好的解决方案是一个系统,该系统将面包屑的描述性跟踪记录到文件中,然后显示相当于“哎呀,对不起!”的内容。在下一个适当的空闲状态以及指向技术支持的链接。
那是我们的应用程序。也许您正在编写一个库,在这种情况下,请忽略我刚才所说的一切。
所以——抱歉,这听起来像是在逃避——但你的问题的答案是:
视情况而定。
【讨论】: