我刚开始使用异常处理在C ++中使用try
和catch
块。 我有一些数据的文本文件,我读使用此文件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.txt
在C:
默认情况下,输入输出流并不会抛出异常。 相反,他们设置了一些错误标志。 你随时可以测试,如果前面的操作与上下文转换为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的工作与他们过得更好。
IOSTREAMS给你打开各种状态位异常的选项。 该参考具有这正是你问了一个非常明显的例子。
那么,这一切都取决于你想,如果文件不存在,该怎么办。
该代码,因为它是目前(假设这是main
),将只退出程序。
但是,如果这是一个函数调用,那么你可能要添加的调用该函数周围的异常处理。
如
try
{
OpenAndReadFile( std::string filename );
}
catch ( std::ifstream::failure e )
{
// do soemthing else
}
catch ( OtherException e )
{
}
catch ( ... )
{
// All others
}
这假定异常抛出被打开以ifstream
。