尝试捕获异常处理C ++(Try catch exception handling C++)

2019-07-29 11:03发布

我刚开始使用异常处理在C ++中使用trycatch块。 我有一些数据的文本文件,我读使用此文件ifstreamgetline ,如下图所示,

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:

Answer 1:

默认情况下,输入输出流并不会抛出异常。 相反,他们设置了一些错误标志。 你随时可以测试,如果前面的操作与上下文转换为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);
}

在大多数情况下,我不认为在输入输出流使例外是值得冒这个险。 该API的工作与他们过得更好。



Answer 2:

IOSTREAMS给你打开各种状态位异常的选项。 该参考具有这正是你问了一个非常明显的例子。



Answer 3:

那么,这一切都取决于你想,如果文件不存在,该怎么办。

该代码,因为它是目前(假设这是main ),将只退出程序。

但是,如果这是一个函数调用,那么你可能要添加的调用该函数周围的异常处理。

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

这假定异常抛出被打开以ifstream



文章来源: Try catch exception handling C++