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 规范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 块处理;若抛出其他标准异常,则由第二个块处理。
最佳实践建议- 优先使用标准异常:减少自定义异常,保持接口一致性。
- 按值捕获异常:catch (const std::exception& e) 避免切片问题。
- 资源管理:结合 RAII 确保异常安全(如智能指针、容器)。
- 避免过度使用 noexcept:仅在确定无异常时标记。
这些机制使 C++ 能够以类型安全、结构化的方式处理错误,同时保持高性能(相比错误码,异常处理可能带来运行时开销)。