デフォルトでは、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);
}
ほとんどの場合、iostream で例外を有効にすることは面倒だとは思いません。API は、それらをオフにした方がうまく機能します。