C++ ライブラリ・リファレンス

出力エラーの処理

operator<< を多重定義するときは、iostream ライブラリからエラーが通知されることになるため、特にエラー検査を行う必要はありません。

エラーが起こると、エラーの起こった iostream はエラー状態になります。その iostream の状態の各ビットが、エラーの大きな分類に従ってセットされます。iostream で定義された挿入子がストリームにデータを挿入しようとしても、そのストリームがエラー状態の場合はデータが挿入されず、そのストリームの状態も変わりません。

一般的なエラー処理方法は、メインのどこかで定期的に出力ストリームの状態を検査する方法です。そこで、エラーが起こっていることが分かれば、何らかの処理を行います。この章では、文字列を出力してプログラムを中止させる関数 error をユーザーが定義しているものとして説明します。関数 error はユーザー定義の関数で、定義済みの関数ではありません。関数 error の内容については、 「入力エラーの処理」を参照してください。iostream の状態を調べるには、演算子 ! を使用します。次の例に示すように、iostream がエラー状態の場合はゼロ以外の値を返します。


if (!cout) error( "output error");

エラーを調べるにはもう 1 つの方法があります。 ios クラスでは、operator void *() が定義されており、エラーが起こった場合は NULL ポインタを返します。したがって、次の文でエラーを検査することができます。


if (cout << x) return ; // 正常終了のときのみ返す

また、次のように ios クラスのメンバー関数 good を使用することもできます。


if ( cout.good() ) return ; // 正常終了のときのみ返す

エラービットは次のような列挙型で宣言されています。


enum io_state { goodbit=0, eofbit=1, failbit=2,
                badbit=4, hardfail=0x80} ;

エラー関数の詳細については、iostream のマニュアルページを参照してください。