例外処理 : 独自関数からの例外のスロー
MFC または他のライブラリ関数によってスローされた例外をキャッチするために MFC 例外処理のパラダイムをのみ使用することができます。ライブラリ コードによってスローされる例外のキャッチに加えて例外条件に発生する可能性のある関数を記述する独自のコードから例外をスローできます。
例外がスローされた場合、現在の関数の実行は直接停止し、最も内側の例外のゾーンの catch ブロックにジャンプします。例外の機能は関数から正常に終了のパスをバイパスします。したがって、正常な完了に削除されているメモリ ブロックを削除して確認する必要があります。
例外をスローする
AfxThrowMemoryExceptionなどの MFC のヘルパー関数の 1 種類を使用します。これらの関数は、適切な型の割り当て済みの例外オブジェクトをスローします。
次の例では、関数は、いずれかのアロケーションが失敗した場合は 2 二つのメモリ ブロックを割り当てると、例外がスローされます:
{ char* p1 = (char*)malloc( SIZE_FIRST ); if( p1 == NULL ) AfxThrowMemoryException(); char* p2 = (char*)malloc( SIZE_SECOND ); if( p2 == NULL ) { free( p1 ); AfxThrowMemoryException(); } // ... Do something with allocated blocks ... // In normal exit, both blocks are deleted. free( p1 ); free( p2 ); }
最初のアロケーションが失敗した場合、メモリ不足例外をスローできます。最初のアロケーションが成功した場合は、 2 1 番目が失敗した場合、例外をスローする前に最初のアロケーション ブロックを解放します。アロケーションが両方とも成功すると、関数を終了する場合に進み、ブロックを解放できます。
または
問題の状況を示すためにユーザー定義例外を使用します。例外として、型、クラス全体の項目もスローできます。
次の例では、失敗がある場合は、のデバイスを通じてサウンドを再生するときに、例外をスローします。
#define WAVE_ERROR -5 { // This Win32 API returns 0 if the sound cannot be played. // Throw an integer constant if it fails. if( !PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC) ) throw WAVE_ERROR; }
[!メモ]
MFC 例外の既定の処理は CException のオブジェクト適用されます (および CExceptionのオブジェクトの派生クラス)へのポインターだけです。上の例のバイパス MFC 例外の機能。