C++文件打开失败检查:异常模式与fail判断
C++ fstream 的 open() 失败时如何检测?请对比两种错误处理方式:检查 fail()/is_open() 与设置异常掩码 exceptions() 的优缺点。
回答
我还是少年
方法1:检查返回值/状态
ifstream fin("nonexistent.txt");
if (!fin.is_open()) {
cerr << "Failed to open file\n";
return;
}
// 或
if (!fin) { // 等效 !fin.good() → fail()
cerr << "Failed to open\n";
}
方法2:异常模式
ifstream fin;
fin.exceptions(ifstream::failbit | ifstream::badbit);
try {
fin.open("nonexistent.txt");
} catch (const ios_base::failure& e) {
cerr << "Exception: " << e.what() << '\n';
cerr << "Error code: " << e.code() << '\n';
}
对比:
| 特性 | 状态检查 | 异常模式 |
|---|---|---|
| 代码简洁性 | 需要 if 检查 | try-catch 块 |
| 性能 | 无额外开销 | 异常有开销(但仅在失败时) |
| 错误信息 | 有限(无法知道具体错误码) | 可获取 std::error_code |
| 与现有代码集成 | 不需要异常处理 | 需要调用方处理异常 |
| 文件不存在重试 | 简单 | 异常适合中断场景 |
最佳实践:
- 简单脚本/工具:状态检查。
- 大型应用中:对齐异常策略(如全部使用或全部不使用)。
- 混合:
exceptions()开启后所有操作都会抛异常,需统一处理。避免在普通流程中用异常做控制流。