C++ catch块
什么是catch块
在C++中,异常处理是通过try-catch
机制实现的。其中,catch
块是用来捕获并处理在相关联的try
块中发生的异常的代码块。当try
块中抛出异常时,程序会寻找匹配的catch
块来处理该异常。
catch块的基本语法如下:
try {
// 可能引发异常的代码
} catch (exceptionType parameter) {
// 处理异常的代码
}
catch块的工作原理
当程序执行到try
块中的代码时,如果发生了异常,程序会立即停止try
块中的执行,并开始查找匹配的catch
块。匹配规则基于异常的类型,如果找到匹配的catch
块,则执行该块中的代码;如果没有找到匹配的catch
块,异常会继续向上传播。
基本示例
下面是一个简单的示例,展示了catch
块的基本用法:
#include <iostream>
using namespace std;
int main() {
try {
cout << "尝试执行可能引发异常的代码" << endl;
throw 20; // 抛出int类型异常
} catch (int e) {
cout << "捕获到int类型异常,值为: " << e << endl;
}
cout << "程序继续执行" << endl;
return 0;
}
输出:
尝试执行可能引发异常的代码
捕获到int类型异常,值为: 20
程序继续执行
在这个例子中:
- 程序首先执行
try
块中的代码 - 当遇到
throw 20
语句时,抛出一个int类型的异常 - 程序查找匹配的
catch
块,找到接受int类型参数的catch
块 - 执行该
catch
块中的代码,打印异常值 - 异常处理完成后,程序继续在
try-catch
结构后执行
catch块的多种形式
1. 捕获特定类型异常
try {
// 可能抛出不同类型异常的代码
} catch (int e) {
// 处理int类型异常
} catch (double e) {
// 处理double类型异常
} catch (char e) {
// 处理char类型异常
}
2. 使用省略号捕获所有异常
try {
// 可能抛出异常的代码
} catch (...) {
// 处理任何类型的异常
}
警告
虽然catch(...)
可以捕获任何异常,但它无法获取关于异常的具体信息,因此应该谨慎使用。通常它被用作最后一个catch块,作为处理未预期异常的保底方案。
3. 捕获对象引用
try {
// 可能抛出异常的代码
} catch (const exception& e) {
// 通过引用处理异常对象
cout << e.what() << endl;
}
异常对象和异常层次结构
C++标准库提供了一个层次化的异常类结构,基类是std::exception
。捕获异常时,可以利用这种层次结构捕获特定类或其子类的异常。
#include <iostream>
#include <exception>
#include <stdexcept>
using namespace std;
int main() {
try {
throw runtime_error("发生运行时错误");
} catch (const runtime_error& e) {
cout << "捕获到runtime_error: " << e.what() << endl;
} catch (const exception& e) {
cout << "捕获到其他exception: " << e.what() << endl;
}
return 0;
}
输出:
捕获到runtime_error: 发生运行时错误
备注
catch块的匹配顺序是从上到下的,应该将更具体的异常类型(子类)放在前面,基类放在后面,否则基类会"屏蔽"子类异常的捕获。