前言
在 C++ 编程中,异常处理是一种强大的机制,能够帮助程序在运行时优雅地处理错误,避免崩溃,提高程序的健壮性和可维护性。相比 C 语言通过错误码进行错误处理的方式,C++ 的异常处理提供了更清晰、更结构化的错误处理方法。
1. 异常的概念
在 C++ 中,异常(Exception)是一种特殊的事件,当程序运行过程中发生错误时,程序可以抛出异常,并由相应的异常处理代码进行处理。
异常处理的核心思想
异常处理的核心思想是将问题的检测与问题的解决分开:
- 检测错误的代码 负责发现问题,并抛出异常。
- 异常处理代码 负责捕获异常并执行相应的错误处理逻辑。
C 语言与 C++ 异常的区别
在 C 语言中,通常使用 错误码 进行错误处理:
- 需要手动检查函数的返回值,以判断是否出现错误。
- 错误码需要进行分类编号,程序需要额外的错误查询机制,处理逻辑复杂。
C++ 通过异常对象进行错误处理:
- 直接抛出一个异常对象,其中可以包含完整的错误信息。
- 由异常处理机制自动捕获异常,避免手动检查返回值,使代码更清晰。
2. 异常的抛出与捕获
当程序检测到错误时,可以使用 throw 关键字抛出异常对象,并使用 catch 语句捕获异常进行处理。
异常的处理流程
- 发生错误时,程序会
throw一个异常对象。 - 异常会沿着调用链向上传播,直到找到匹配的
catch语句。 - 如果找到匹配的
catch,则执行其中的异常处理代码。 - 如果没有找到匹配的
catch,则程序会终止。
抛出异常的规则
throw语句后面的代码不会被执行,程序会立即跳转到匹配的catch语句。- 异常对象会被复制一份,并在
catch语句处理后销毁。 catch语句必须与异常的类型匹配,否则异常会继续向上传播。
匹配规则
- 严格匹配:
catch语句的类型必须与throw语句的类型一致,或者是它的基类。 - 基类匹配:如果
catch语句的参数是基类对象,可以捕获派生类异常(多态)。 - 通配符捕获:使用
catch (...)语句,可以捕获所有类型的异常。
#include <iostream>
#include <vector>
using namespace std;
double divide {
{
(b == ) {
string error = ;
error;
} ()a / b;
} ( errid) {
cout << errid << endl;
}
;
}
{
len, time;
cin >> len >> time;
{
cout << (len, time) << endl;
} ( * errmsg) {
cout << errmsg << endl;
}
cout << __FUNCTION__ << << __LINE__ << << endl;
}
{
() {
{
();
} ( string& errmsg) {
cout << errmsg << endl;
}
}
;
}


