一、异常是什么?现实版类比
想象你在写字楼里办公:
- 正常流程:上班→工作→下班→回家(程序正常执行)
- 突发火灾:触发警报→疏散→消防队灭火(程序抛出异常→捕获处理)
C++异常的本质:当程序遇到无法继续执行的严重错误(比如文件打不开、内存不足、除零错误),立刻“拉响警报”,中断当前流程,跳转到专门的“应急预案”(catch
块)处理问题!
二、异常处理三板斧:throw
、try
、catch
1. 触发警报:throw
// 发现火情(错误)时,立刻抛异常
void openFile(const string& filename) {
ifstream file(filename);
if (!file.is_open()) {
throw runtime_error("文件打不开!文件名:" + filename);
}
// ...正常操作
}
2. 监控区域:try
try {
// 重点监控区域(可能着火的区域)
openFile("秘密数据.txt");
// ...其他操作
}
3. 应急小组:catch
catch (const runtime_error& e) {
// 消防队灭火(处理文件打不开的情况)
cerr << "错误:" << e.what() << endl;
// 记录日志、尝试备用文件...
}
catch (...) {
// 捕获所有未知异常(防漏网之鱼)
cerr << "未知错误!启动紧急预案" << endl;
}
三、异常的分类:你需要不同的“灭火器”
1. 标准异常(C++自带的灭火器)
异常类 | 用途 | 示例场景 |
---|---|---|
std::runtime_error |
运行时无法预料的错误 | 文件不存在、网络断开 |
std::logic_error |
程序逻辑错误 | 传入非法参数、越界访问 |
std::bad_alloc |
内存分配失败 | new 操作失败 |
//使用
throw runtime_error("发生错误了!!");
try {
func(a); //可能发生异常的语句
} catch (const std::runtime_error& e) {
//抛出运行时异常
cerr << "Runtime error: " << e.what() << endl;
}
//使用e.what()可以获取异常信息: "发生错误了!!"