C++文件流默认不抛异常,可通过exceptions()设置badbit和failbit掩码使操作失败时抛出ios_base::failure异常,如文件不存在触发failbit则被catch捕获,建议仅对关键错误启用以平衡错误处理与程序中断。

在C++中,文件流(如
std::ifstream、
std::ofstream和
std::fstream)默认不会在发生错误时抛出异常。为了在文件操作失败时自动抛出异常,可以通过设置流的异常掩码(exceptions mask)来实现。
使用 exceptions() 成员函数设置异常掩码
所有文件流类都继承自
std::ios_base,并提供了一个
exceptions()成员函数,用于设置在哪些操作失败时抛出
std::ios_base::failure异常(C++11 之前为
std::ios::failure)。
你可以通过传入一个由以下标志组成的掩码来启用异常:
- std::ios::badbit:表示发生了不可恢复的读写错误(如写入只读文件)。
- std::ios::failbit:表示格式错误或无法执行请求的操作(如读取一个非数字字符到整数变量)。
- std::ios::eofbit:表示到达文件末尾。通常不建议为此抛出异常,因为EOF是正常操作的一部分。
调用
exceptions(mask)后,只要流的状态设置了掩码中包含的任意位,就会抛出异常。
立即学习“C++免费学习笔记(深入)”;
示例:开启 badbit 和 failbit 异常
#include#include #include int main() { std::ifstream file("nonexistent.txt"); // 启用 badbit 和 failbit 的异常抛出 file.exceptions(std::ifstream::failbit | std::ifstream::badbit); try { int value; file >> value; // 如果文件打不开,会触发 failbit,从而抛出异常 } catch (const std::ios_base::failure& e) { std::cerr << "文件操作异常: " << e.what() << '\n'; } return 0; }
在这个例子中,由于文件不存在,
failbit会被置位,由于我们已启用该位的异常,程序会抛出
std::ios_base::failure异常,并被
catch块捕获。
注意事项
设置异常掩码后,流的某些操作可能变得“异常安全”但更易中断。建议仅对关键错误(如
badbit和必要的
failbit)启用异常。
如果未设置
failbit的异常,一些格式错误不会中断程序,这在某些场景下是期望行为。需根据实际需求权衡。
记得包含必要的头文件:
和
。 基本上就这些。通过合理使用
exceptions(),可以让文件流在出错时自动抛出异常,简化错误处理逻辑。










