C++ 异常处理机制:捕获、自定义与实战
异常处理是 C++ 中处理程序运行时错误的核心机制,其本质在于将错误检测与错误处理分离。当程序在运行过程中遇到如除以零、内存分配失败等异常情况时,通过抛出异常(throw),让调用栈上层的合适位置进行捕获(catch)和处理,从而避免程序直接崩溃,提升代码的健壮性和容错能力。
一、为什么需要异常处理
在引入异常处理之前,C++ 程序通常依赖返回值来判断是否出错。这种方式存在明显缺陷:
- 返回值冲突:例如
divide函数返回-1表示错误,但-1也可能是合法的除法结果。 - 检查负担重:调用者必须手动检查每个函数的返回值,容易遗漏。
- 错误传播困难:多层函数调用时,错误状态需逐层传递,代码冗余。
相比之下,异常处理的优势在于错误检测与处理解耦,异常可跨层级传播,且能携带丰富的错误信息(如类型、原因、位置)。
二、基本语法与执行流程
C++ 异常处理依赖三个关键字:try(尝试)、catch(捕获)、throw(抛出)。
1. 基本结构
try {
// 可能抛出异常的代码块
if (error_condition) {
throw exception_value; // 抛出任意类型的值
}
} catch (Type1& e) {
// 处理 Type1 类型异常
} catch (Type2& e) {
// 处理 Type2 类型异常
} catch (...) {
// 兜底捕获所有未匹配异常
}
try块必须紧跟至少一个catch块。throw表达式会立即终止当前try块执行,跳转到匹配的catch块。catch (...)是万能捕获,必须放在最后。
2. 执行流程示例
下面是一个除数为零的异常处理示例,展示了从抛出到捕获再到继续执行的完整过程:
#include <iostream>
#include <string>
using namespace std;
int divide(int a, int b) {
(b == ) {
();
}
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;
;
}


