C++何时处理异常

C++ When to handle an exception

本文关键字:异常 处理 何时 C++      更新时间:2023-10-16

如果您有这样的函数调用,哪个级别最适合处理我的throw?我只想弹出一条错误消息。

  class Test {
     void A() {
        B();
        // try and catch here ?
     }
     void B() {
        C();
        // try and catch here ?
     }
     void C() {
        throw 1;
     }
  }
  int main()
  {
     Test test;
     test.A();
     // try and catch here ?
     return 0;
  }

何时决定处理异常在很大程度上取决于设计模式和特定场景,但通常情况下,您希望在能够可靠处理异常时尽快处理异常。

如果没有足够的信息来处理异常,则应该在调用堆栈上抛出更高的异常。原因如下:

  1. 异常比检查错误处理的返回类型更昂贵
  2. 如果你一直在调用堆栈中抛出异常,那么很多代码将无法运行(或者至少你必须编写很多混乱的finally块)
  3. 调用堆栈中的高级函数将承担捕获许多不同类型异常的负担,这会妨碍它们的预期工作

相反,如果您能尽早可靠地发现并处理异常:

  1. 调用堆栈上比catch块更高的函数甚至不知道发生了异常

  2. 通过避免过度抛出异常,您将获得性能提升

  3. 通常是为了分离关注点而进行的更好的设计。

好吧,这取决于您的实际用例。

如果你只是想弹出一条错误消息并终止你的程序,你根本不应该捕捉到任何东西。

默认的std::terminate处理程序已经完成了此操作。

如果你只是想显示一条错误消息,并继续进行构建,你应该从能够克服错误并能够安全地继续程序运行状态的级别开始。