例外処理 : 独自関数からの例外のスロー
MFC 例外処理パラダイムは、MFC または他のライブラリ内で関数によってスローされた例外をキャッチするためだけに使用できます。 ライブラリ コードによってスローされた例外をキャッチするだけでなく、例外条件が発生する可能性がある関数を書いている場合は、独自のコードから例外をスローすることもできます。
例外がスローされると、現在の関数の実行は停止され、内部例外フレームの catch
ブロックに直接ジャンプします。 例外メカニズムは、関数からの通常の終了パスをバイパスします。 そのため、通常の終了時に削除されるこれらのメモリ ブロックは、必ず削除するようにします。
例外をスローには
AfxThrowMemoryException
などの MFC ヘルパー関数のいずれかを使用します。 これらの関数によってスローされるのは、事前に割り当てられた適切な型の例外オブジェクトです。次の例では、関数は 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 つ目の割り当てが失敗した場合は、例外をスローする前に最初の割り当てブロックを解放する必要があります。 両方の割り当てに成功した場合は、通常どおりに処理を進め、関数を終了するときにブロックを解放できます。
- または
ユーザー定義の例外を使用して、問題の状態を示します。 あらゆる型の項目 (クラス全体でも) を例外としてスローできます。
次の例では、wave デバイスを使ってサウンドの再生を試み、失敗した場合に例外をスローします。
#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; }
Note
MFC の既定の例外処理は、CException
オブジェクト (および CException
派生クラスのオブジェクト) へのポインターにのみ適用されます。 上記の例では、MFC の例外メカニズムをバイパスします。