C++ 框架内置了哪些异常处理机制?

高手打扰一下,C++ 框架内置了哪些异常处理机制?
最新回答
梦似曾见

2026-10-22 18:58:50

C++ 框架内置的异常处理机制主要包括以下核心组件,它们共同构成了完整的错误处理体系:

1. std::exception 类层次结构
  • 基类作用:C++ 标准库提供 std::exception 作为所有标准异常的基类,用户自定义异常应继承此类。
  • 关键方法:通过虚函数 what() 返回错误描述字符串(如 const char*)。
  • 扩展性:支持派生标准异常类型(如 std::runtime_error、std::logic_error),也支持自定义异常:class MyException : public std::exception {public: const char* what() const noexcept override { return "Custom exception occurred"; }};
2. try-catch 语句
  • 结构:try 块包裹可能抛出异常的代码,catch 块按类型捕获并处理异常。
  • 多级捕获:支持按异常类型层次捕获(先子类后基类):try { // 可能抛出异常的代码} catch (const MyException& e) { // 处理自定义异常} catch (const std::exception& e) { // 处理所有标准异常} catch (...) { // 捕获所有其他异常(不推荐滥用)}
3. throw 关键字
  • 抛出异常:通过 throw 抛出内置类型、对象或指针(建议抛出对象以保证资源管理):throw std::runtime_error("Invalid argument");throw MyException(); // 抛出自定义异常
  • 执行流中断:抛出后立即终止当前函数,控制权转移至匹配的 catch 块。
4. noexcept 规范
  • 函数声明:标记函数是否可能抛出异常,优化编译器生成的代码:void safeFunction() noexcept; // 承诺不抛出异常void riskyFunction() noexcept(false); // 可能抛出异常(默认)
  • 用途:

    移动构造函数、析构函数通常标记为 noexcept 以支持容器优化。

    违反 noexcept 约定会触发 std::terminate。

5. 标准异常类型

C++ 标准库提供常用异常类,均继承自 std::exception:

  • 逻辑错误:std::invalid_argument、std::out_of_range
  • 运行时错误:std::runtime_error、std::overflow_error
  • I/O 错误:std::ios_base::failure(如文件操作失败)
实战案例解析#include <exception>#include <iostream>#include <fstream>int main() { try { std::ifstream file("nonexistent.txt"); if (!file) { throw std::runtime_error("File open failed"); } // 文件操作... } catch (const std::ios_base::failure& e) { std::cerr << "I/O Error: " << e.what() << std::endl; } catch (const std::exception& e) { std::cerr << "General Error: " << e.what() << std::endl; } return 0;}
  • 流程:文件打开失败时抛出 std::ios_base::failure,由第一个 catch 块处理;若抛出其他标准异常,则由第二个块处理。
最佳实践建议
  1. 优先使用标准异常:减少自定义异常,保持接口一致性。
  2. 按值捕获异常:catch (const std::exception& e) 避免切片问题。
  3. 资源管理:结合 RAII 确保异常安全(如智能指针、容器)。
  4. 避免过度使用 noexcept:仅在确定无异常时标记。

这些机制使 C++ 能够以类型安全、结构化的方式处理错误,同时保持高性能(相比错误码,异常处理可能带来运行时开销)。