默认情况下,iostream 不会引发异常。相反,他们设置了一些错误标志。您始终可以通过上下文转换为 bool 来测试之前的操作是否成功:
ifstream file;
file.open("C:\\Test.txt", ios::in);
if (!file) {
// do stuff when the file fails
} else {
string line;
string firstLine;
if (getline(file, line, ' '))
{
firstLine = line;
getline(file, line);
}
}
exceptions
您可以使用成员函数打开异常。我发现这样做往往没有多大帮助,因为你不能再做类似的事情while(getline(file, line))
:这样的循环只会在异常情况下退出。
ifstream file;
file.exceptions(std::ios::failbit);
// now any operation that sets the failbit error flag on file throws
try {
file.open("C:\\Test.txt", ios::in);
} catch (std::ios_base::failure &fail) {
// opening the file failed! do your stuffs here
}
// disable exceptions again as we use the boolean conversion interface
file.exceptions(std::ios::goodbit);
string line;
string firstLine;
if (getline(file, line, ' '))
{
firstLine = line;
getline(file, line);
}
大多数时候,我不认为在 iostreams 上启用异常是值得的。API 在它们关闭的情况下效果更好。