异常处理概述
异常处理是 C++ 中处理程序运行时错误的核心机制,其本质在于将错误检测与错误处理分离。当程序在运行过程中遇到如除以零、内存分配失败等问题时,可以在出错点抛出异常,然后在合适的层级(如主函数或业务逻辑层)捕获并处理,从而避免程序直接崩溃,提升代码的健壮性。
为什么需要异常处理
在引入异常处理之前,程序通常依赖返回值来判断是否出错。这种方式存在明显缺陷:
- 返回值冲突:例如除法函数返回
-1可能表示错误,但也可能是合法的计算结果。 - 调用链冗余:多层函数调用时,必须逐层传递错误状态,代码冗余且容易遗漏检查。
- 错误传播困难:深层的错误难以传递到顶层进行统一处理。
相比之下,异常处理的优势在于错误检测与处理解耦,异常可以跨函数、跨层级自动传播,并能携带丰富的错误信息(如类型、原因、位置),有效防止小错误导致系统崩溃。
核心组件与流程
C++ 异常处理依赖三个关键字:
- throw:检测到错误时抛出异常对象。
- try:包裹可能抛出异常的代码块,定义异常检测范围。
- catch:捕获并处理匹配的异常类型。
基本流程是:try 块执行代码 → 若出错则 throw 抛出异常 → 程序跳转至最近的匹配 catch 块 → 执行处理后继续向下运行。
基本语法与执行流程
语法结构
try {
// 可能抛出异常的代码
if (错误条件) {
throw 异常值; // 可抛出任意类型:int, string, 自定义类等
}
} catch (异常类型 变量名) {
// 处理特定类型异常
} catch (...) {
// 兜底捕获所有未匹配异常
}
注意 try 块不能单独存在,必须紧跟至少一个 catch 块。catch(...) 作为万能捕获,必须放在最后。
执行流程示例
下面是一个除数为零的异常处理示例,展示了异常如何中断当前执行流并跳转:
#include <iostream>
using namespace std;
int divide(int a, int b) {
if (b == 0) {
throw string();
}
a / b;
}
{
x = , y = ;
{
cout << << endl;
result = (x, y);
cout << x << << y << << result << endl;
} ( string& err_msg) {
cout << << err_msg << endl;
} (...) {
cout << << endl;
}
cout << << endl;
;
}


