1,异常的概念

异常处理是C++用于管理 程序运行时错误的核心机制,通过try,catch,throw等关键字实现。它允许将错误检测与处理逻辑分离,提升代码的可读性和健壮性。

1.2,异常的抛出和捕获
  • 程序出现问题时,我们通过抛出(throw)一个对象来引发一个异常,该对象的类型和当前的调用链决定了应该由哪个catch来捕获处理该异常。

  • 当throw执行时,throw后面的代码不再执行。程序的执行从throw位置跳到与之匹配的catch模块。catch可能是同一个函数中的一个局部的catch,也可能是调用链中另一个函数中的catch。一旦程序开始异常处理,沿着调用链的对象都将被销毁。
  • 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个局部对象,所以会生成一个拷贝对象,拷贝对象再catch子句后销毁。

代码示例:

#include <iostream> #include <stdexcept> double divide(int a, int b) { if (b == 0) { throw std::runtime_error("除数不能为零!"); //抛出异常对象 } return a / b; } int main() { try { std::cout << divide(10, 0) << std::endl; } catch (const std::runtime_error& e) { //捕获异常,处理异常 std::cerr << "错误: " << e.what() << std::endl; } return 0; } // 输出:错误: 除数不能为零!

1.3,栈展开
  • 抛出 异常后,程序暂停当前函数的执行,开始寻找与之匹配的catch子句,首先检查throw是否再try块内部,如果在则查找匹配的catch语句,如果由匹配的,则跳到catch地方进行处理。
  • 如果当前函数没有try/catch子句,或者有但是类型不匹配,退出当前函数,继续在外层调用函数链中查找,上述查找catch的过程称为栈展开。

  • 如果到达main函数,依旧没有找到匹配的catch子句,则程序会调用terminate函数终止程序。有时候达到main函数,还没有找到匹配的,而我们是不希望终止程序的,所以main函数最后一般都使用catch(...),它可以捕获任意类型的异常,但不知道异常错误是什么
  • 如果找到匹配的catch子句处理后,catch子句代码会继续执行。
1.4,异常的重新抛出

有时catch到一个异常对象 后,需要对错误进行分类,其中的某种异常错误 需要进行特殊处理,其他异常则重新抛出给外层调用链处理。捕获异常后重新抛出,直接throw,就可以把捕获的对象重新抛出。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐