1

我刚刚开始使用trycatch块在 C++ 中处理异常。我有一个包含一些数据的文本文件,我正在使用ifstream和读取这个文件,getline如下所示,

ifstream file;
file.open("C:\\Test.txt", ios::in);
string line;
string firstLine;
if (getline(file, line, ' '))
{
    firstLine = line;
    getline(file, line);
}

我想知道如何实现异常处理,以防file.open由于给定路径中不存在指定文件而无法打开指定文件,例如没有Test.txtC:

4

3 回答 3

13

默认情况下,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 在它们关闭的情况下效果更好。

于 2012-05-18T09:42:32.863 回答
3

IOstreams 让您可以选择打开各种状态位的异常。该参考资料有一个非常清晰的示例,这正是您所要求的。

于 2012-05-18T09:45:33.170 回答
0

好吧,如果文件不存在,这一切都取决于你想要做什么。

目前的代码(假设是main)将退出该过程。

但是,如果这是一个函数调用,那么您可能希望在对该函数的调用周围添加异常处理。

例如

try
{
    OpenAndReadFile( std::string filename );
}
catch ( std::ifstream::failure e )
{
    // do soemthing else
}
catch ( OtherException e )
{
}
catch ( ... )
{
    // All others
}

这假定为ifstream.

于 2012-05-18T09:43:25.270 回答