什么时候应该创建自己的异常类型?

Ami*_*ira 24 c++ exception-handling exception

我正在开发一个项目,我们将旧的C代码重构为新的C++,我们正在使用异常进行错误处理.

我们正在为不同的模块创建不同的异常类型.

我认为这不值得,但我没有任何有效的论据来证明我的观点.因此,如果我们编写标准库,您将看到vector_exception,list_exception等.

在考虑这件事的时候,我偶然发现了这个问题:

什么时候应该创建自己的异常类型,何时应该坚持已在std库中创建的异常?

另外,如果我们采用上述方法,那么在不久的将来我们可能面临的问题是什么呢?

Use*_*ess 25

在以下情况下创建自己的异常类

  1. 您可能希望在处理时区分它们.如果它们是不同的类型,您可以选择编写不同的catch子句.它们仍然应该有一个共同的基础,以便在适当的时候进行共同处理
  2. 您想要添加一些您可以在处理程序中实际使用的特定结构化数据

分开listvector例外似乎并不值得,除非有一些类似于列表的东西或关于它们的矢量.你真的会根据哪种类型的容器出错而进行不同的捕获处理吗?

相反,对于可能在运行时可恢复的事物具有单独的异常类型可能是有意义的,而不是回滚但可以重试的事物,而不是那些绝对致命或指示错误的事物.


JVA*_*pen 10

在任何地方使用相同的例外很容易.特别是当试图抓住那个例外.不幸的是,它打开了口袋妖怪异常处理的大门.它带来了捕获您不期望的异常的风险.

对所有不同的模块使用专用的例外添加了几个优点:

  • 针对每种情况的自定义消息,使其对报告更有用
  • Catch只能捕获预期的异常,更容易在意外情况下崩溃(是的,这比不正确的处理更有优势)
  • 崩溃时,IDE可以显示异常类型,通过调试帮助更多

  • TIL我了解到Pokemon Exception Handling是一个真正的术语.如果你需要像我一样查找,可以[帮助]的快速链接(https://softwareengineering.stackexchange.com/questions/319088/is-indiscriminately-catching-exceptions-pokemon-exception-handling-ever-accept )... (3认同)

sta*_*wer 5

我认为除了其他答案的原因可能是代码可读性,因为很多时候程序员花费支持它.考虑两段代码(假设它们抛出"空帧"错误):

void MyClass::function() noexcept(false) {

    // ...
    if (errorCondition) {
        throw std::exception("Error: empty frame");
    }
}
Run Code Online (Sandbox Code Playgroud)
void MyClass::function() noexcept(false) {

    // ...
    if (errorCondition) {
        throw EmptyFrame();
    }
}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我认为它更具可读性,并且用户的消息(使用what()函数打印)隐藏在此自定义异常类中.