C++ 异常处理(Exception Handling)是一种机制,用于处理程序运行时可能发生的错误或异常情况,确保程序在出现问题时能够优雅地恢复或终止。
异常处理通过 try、catch 和 throw 关键字实现,允许开发者捕获和处理错误,而不依赖于传统的错误代码检查。
以下是 C++ 异常处理的详细说明,包括基本概念、用法、注意事项和详细的示例代码。
一、异常处理的基本概念
- 异常的定义
- 异常是程序运行时发生的非预期情况(如文件无法打开、内存分配失败、除零错误等)。
- C++ 异常处理允许将错误检测与错误处理分离,提高代码的可读性和可维护性。
- 核心关键字
- throw:抛出异常,触发异常处理机制。
- try:定义可能抛出异常的代码块。
- catch:捕获并处理特定类型的异常。
- 异常的传播
- 异常会沿调用栈向上传播,直到被某个 catch 块捕获或程序终止。
- 如果未捕获异常,程序会调用 std::terminate,通常导致程序崩溃。
- 异常类型
- C++ 允许抛出任意类型的异常(包括基本类型、自定义类等)。
- 常用标准异常类定义在 <stdexcept> 中,如 std::runtime_error、std::out_of_range 等。
二、异常处理的机制
- 异常抛出(throw)
- 使用 throw 关键字抛出异常对象,例如 throw std::runtime_error("Error occurred");。
- 抛出的对象会被复制,传递给匹配的 catch 块。
- 异常捕获(try-catch)
- try 块包裹可能抛出异常的代码。
- catch 块指定捕获的异常类型,处理相应的错误。
- 可以有多个 catch 块,按类型匹配顺序执行。
- 异常规范(C++11 废弃)
- C++98/03 支持函数异常规范(throw(Type)),但 C++11 废弃此特性,推荐使用 noexcept。
- noexcept 关键字(C++11 引入)
- noexcept 声明函数不会抛出异常,优化性能并明确语义。
- noexcept(false) 表示可能抛出异常(默认行为)。
三、标准异常类C++ 标准库在 <stdexcept> 中定义了常用的异常类,继承自 std::exception:
- std::exception:所有标准异常的基类,提供虚函数 what() 返回错误描述。
- std::runtime_error:运行时错误,如 std::overflow_error、std::underflow_error。
- std::logic_error:逻辑错误,如 std::invalid_argument、std::out_of_range。
- std: