C++ 异常处理实战:try、catch、throw 完整指南与示例
什么是 C++ 异常处理?
异常处理让 C++ 程序能优雅地从意外运行时错误中恢复。错误发生时,控制流跳转到专门的处理器,由其决定如何响应。
将可能出错的代码放入 try 块,后跟一个或多个 catch 子句,即可为程序提供清晰的异常处理路径。
若无异常抛出,try 块正常执行,处理器被跳过。
本教程你将学到:
- 异常处理的概念与重要性
- 核心关键字:
throw、catch、try - 语法与常用模式
- C++ 标准库定义的标准异常
- 如何创建并使用用户自定义异常
为什么需要异常处理?
异常处理提供实实在在的好处:
- 将错误处理逻辑与常规代码分离,提升可读性与可维护性。
- 函数仅暴露其关心的异常;调用者可处理其余异常。
异常处理三大关键字
三个关键字构成 C++ 异常处理的骨干:
- throw – 通过创建异常对象发出错误信号。
- catch – 拦截异常并提供响应代码。
- try – 标记可能抛出异常的代码区域。
try 块内的代码称为受保护代码;若抛出异常,对应的 catch 块执行。
语法
try { // 受保护代码 } catch (Exception_Name exception1) { // 处理 exception1 } catch (Exception_Name exception2) { // 处理 exception2 } // ... 更多 catch 块
- 单个
try可跟多个catch子句。 - 每个
catch子句中的类型指定要捕获的异常。 catch内部可通过选定的标识符引用捕获的异常。
示例 1:访问越界的 vector 元素
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; vec.push_back(0); vec.push_back(1); try { vec.at(2); // 越界 } catch (exception& ex) { cout << "Exception occurred!" << endl; } return 0; }
输出:

代码截图:

代码拆解:
- 包含
iostream和vector用于 I/O 与容器支持。 - 使用
std命名空间避免全限定名。 - 实例化
vector<int>并填充数据。 - 在
try块中尝试访问超出 vector 范围的元素。 - 捕获标准
std::exception并输出提示。 - 从
main返回。
示例 2:处理除零错误
#include <iostream> using namespace std; double zeroDivision(int x, int y) { if (y == 0) { throw "Division by Zero!"; } return static_cast<double>(x) / y; } int main() { int a = 11; int b = 0; double c = 0; try { c = zeroDivision(a, b); cout << c << endl; } catch (const char* message) { cerr << message << endl; } return 0; }
输出:

代码截图:

代码拆解:
- 定义
zeroDivision,除数为零时抛出 C 字符串。 - 在
try块中调用该函数并打印结果。 - 捕获字符串异常并输出错误信息。
C++ 标准异常

标准库在 <exception> 中声明了丰富的异常层级。常用异常如下:
| 异常 | 说明 |
|---|---|
| std::exception | 所有标准异常的基类 |
| std::bad_alloc | new 分配失败时抛出 |
| std::bad_cast | dynamic_cast 转型失败时抛出 |
| std::bad_exception | 用于指示意外异常 |
| std::bad_typeid | typeid 作用于空多态左值时抛出 |
| std::logic_error | 程序员应可检测到的逻辑错误 |
| std::domain_error | 数学函数域无效 |
| std::invalid_argument | 函数接收无效参数 |
| std::length_error | 尝试创建过长字符串 |
| std::out_of_range | vector::at 索引越界时抛出 |
| std::runtime_error | 其他类别未捕获的运行时错误 |
| std::overflow_error | 数学上溢 |
| std::range_error | 值超出操作范围 |
| std::underflow_error | 数学下溢 |
用户自定义异常
可扩展 std::exception 基类创建领域特定错误类型。重写 what() 提供描述性消息。
示例:自定义异常
#include <iostream> #include <exception> using namespace std; class NewException : public exception { public: const char* what() const noexcept override { return "newException occurred"; } } newex; int main() { try { throw newex; } catch (exception& ex) { cout << ex.what() << '\n'; } return 0; }
输出:

代码截图:

代码拆解:
- 从
std::exception派生NewException并重写what()。 - 实例化
newex用于抛出。 - 在
try块中抛出newex。 - 以引用捕获
std::exception并通过what()打印消息。
核心收获
- 异常处理是构建健壮 C++ 应用、从运行时错误恢复的关键。
- 用
try保护代码,catch响应,throw发出信号。 - 善用丰富的标准异常体系,必要时扩展
std::exception定制错误类型。 - 将错误处理逻辑与业务逻辑分离,代码更清晰、可维护。
C语言
- C++ 注释最佳实践:编写可读、可维护代码的注释艺术
- C++ 运算符全解析:类型、示例与示例程序
- 掌握 C++ switch-case:语法、用法与实战示例
- C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理
- C++ 结构体详解:定义、初始化、指针、函数参数与局限性
- 掌握 C++ std::list:语法、函数与实战示例
- C++ Struct 与 Class 核心差异、语法及最佳实践
- 2021 年 Windows/macOS/Linux 上 15 款最佳 C++ IDE(免费与付费)
- 精通 Python 异常处理:try、except、else 与 finally 详解
- 精通 Python 异常处理:try、except、finally 与 raise 高效用法
- 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解
- 精通 Java 异常处理:try-catch-finally 与资源管理