前言
在程序开发过程中,错误处理是确保软件健壮性的关键环节。C 语言采用返回错误码或直接终止程序的方式处理错误,但其在复杂程序中往往显得繁琐且不够直观。C++ 引入了异常机制,为错误处理提供了一种更灵活、更结构化的解决方案。
本文将系统讲解 C++ 异常处理的核心概念,包括异常的组成部分(throw、try、catch)、抛出与匹配原则、函数调用链中的栈展开机制,以及异常的重新抛出等关键知识点。同时,还将深入探讨异常安全问题、异常规范的演进(从 C++98 到 C++11),并介绍自定义异常体系与 C++ 标准库异常体系的特点。
此外,本文会客观分析异常机制的优缺点,帮助读者理解在实际开发中如何合理运用异常。最后通过练习案例巩固所学知识,让读者能够熟练掌握异常处理的实践技巧,从而编写出更可靠、易维护的 C++ 代码。
C 语言处理错误的方式
- 终止程序,比如:
assert - 返回错误码——这个就不方便,需要程序员自己去查找到底错误是什么
实际中 C 语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。
C++ 异常的概念
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。
它的组成部分:
throw– 抛异常try– 里面放可能抛出异常的代码,try{}后面通常跟着一个或多个catch块catch– 捕获异常
异常的使用
void Func(int b) {
if (b == 0) throw("good");
}
int main() {
try {
Func(3);
} catch (const char* errmsg) {
cout << errmsg << endl;
}
return 0;
}
异常抛出和匹配的原则
- 异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个 catch 的处理代码。
- 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。
- 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被 catch 以后销毁。(这里的处理类似于函数的传值返回)
catch(...)可以捕获任意类型的异常,问题是不知道异常错误是什么。- 公司里有自己的异常体系,一般抛出的都是继承的派生类对象,捕获一个基类就可以了


