C++异常处理

一、 为什么要有异常?​
  1. 传统错误处理的缺点

    • 错误码(C风格)​​:
      • 需要手动检查返回值,代码冗余。
      • 容易忽略错误(如忘记检查errno)。
    • 全局状态(如errno)​​:
      • 非线程安全,状态可能被覆盖。
  2. 异常的优势

    • 分离正常逻辑和错误处理​:try/catch 结构清晰。
    • 自动传播错误​:异常可跨多层函数调用传递。
    • 类型安全​:异常是对象(如std::runtime_error),可携带详细信息。
  3. 适用场景

    • 不可恢复的错误(如内存不足、文件不存在)。
    • 构造函数失败(无法通过返回值报错)。

二、 异常的用法
  1. 抛出异常

    • 使用 throw 关键字抛出任意类型的对象(推荐继承 std::exception):

      void loadFile(const std::string& path) {
          if (!fileExists(path)) {
              throw std::runtime_error("File not found: " + path);
          }
      }
      
  2. 捕获异常

    • try/catch 块按顺序匹配异常类型:

      try {
          loadFile("data.txt");
      } catch (const std::runtime_error& e) {
          std::cerr << "Error: " << e.what() << std::endl;
      } catch (...) { // 捕获所有异常(慎用)
          std::cerr << "Unknown error" << std::endl;
      }
      
  3. 标准异常类

    异常类 用途
    std::exception 所有标准异常的基类
    std::runtime_error 运行时错误(如文件不存在)
    std::logic_error 逻辑错误(如无效参数)
    std::bad_alloc 内存分配失败

三、 谨慎使用异常
  1. 性能开销

    • 异常处理会增加代码大小和运行时开销(尤其在未抛出异常时)。
  2. 设计原则</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值