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 番目の割り当てが失敗した場合は、例外をスローする前に最初の割り当てブロックを解放する必要があります。 両方の割り当てが成功した場合は、正常に続行し、関数を終了するときにブロックを解放できます。
- または
ユーザー定義の例外を使用して、問題の状態を示します。 例外として、クラス全体であっても、任意の型の項目をスローできます。
次の例では、ウェーブ デバイスを介してサウンドの再生を試み、障害が発生した場合に例外をスローします。
#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 の例外メカニズムがバイパスされています。