C++ 抛出不同类型的异常是否有用?

C++ 抛出不同类型的异常是否有用?,c++,exception,C++,Exception,在大型项目中抛出不同的异常是否有用,例如std::runtime\u error或std::invalid\u argument?还是最好在常规std::exception中为what()添加一个好的文本参数?什么时候从std::exception派生一些子类才有意义呢 Rumo使用抛出最具体的异常总是有意义的。由于每个异常都应该从std::exception中派生出来,因此代码捕获可能会决定它要处理的粒度级别(S.Meyers的“更有效的C++”中的第13项通过引用捕获) 仅使用std::ex

在大型项目中抛出不同的异常是否有用,例如
std::runtime\u error
std::invalid\u argument
?还是最好在常规
std::exception
中为
what()
添加一个好的文本参数?什么时候从
std::exception
派生一些子类才有意义呢


Rumo

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

仅使用
std::exception
和一些文本,禁止使用:

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

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

仅使用
std::exception
和一些文本,禁止使用:

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

所有的C++异常类都是从类<代码> STD::因此,捕获代码可能会在

std::exception&
中捕获异常,或者使用特定的clas处理程序捕获异常,但是抛出特定的异常更有意义,以便适当的处理程序可以处理特定的异常 STD::因此,捕获代码可能会在
std::exception&
中捕获异常,或者使用特定的clas处理程序捕获异常,但是抛出特定的异常更有意义,以便适当的处理程序可以处理特定的异常

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

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,如果你问我的话,这类代码非常容易出错。

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

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,如果你问我的话,这很容易出错。

虽然我原则上同意


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

这可能是必要的,也可能不是

我为一个巨大的项目写了一个框架,一开始我全力以赴设计所有错误报告系统之母——它会很漂亮的。设计的一部分是异常类的层次结构

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

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

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

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

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


这要看情况。

虽然我原则上同意


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

这可能是必要的,也可能不是

我为一个巨大的项目写了一个框架,一开始我全力以赴设计所有错误报告系统之母——它会很漂亮的。设计的一部分是异常类的层次结构

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

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

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

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

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


<>这取决于.< /P>在C++中引用引用(其他问题),JDHAAN,我认为我们是在泛泛而谈,而不是C++特定的。通过C++引用(在其他问题中的切片问题)捕获异常。