我刚开始使用try
和catch
块在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
无法打开指定文件的情况下如何实现异常处理,因为它在给定路径中不存在,例如{{1}中没有Test.txt
}}
答案 0 :(得分:13)
默认情况下,iostreams不会抛出异常。相反,他们设置了一些错误标志您始终可以测试上一个操作是否成功通过上下文转换为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);
}
大多数时候,我不认为在iostream上启用例外是值得的麻烦。关闭API可以更好地运行API。
答案 1 :(得分:3)
IOstreams允许您选择为各种状态位启用异常。 reference有一个非常明确的例子,正是你所要求的。
答案 2 :(得分:0)
嗯,如果文件不存在,这一切都取决于你想要做什么。
目前的代码(假设这是main
)将退出该过程。
但是,如果这是一个函数调用,那么您可能希望在对此函数的调用周围添加异常处理。
E.g。
try
{
OpenAndReadFile( std::string filename );
}
catch ( std::ifstream::failure e )
{
// do soemthing else
}
catch ( OtherException e )
{
}
catch ( ... )
{
// All others
}
这假设为ifstream
开启了异常抛出。