例外処理 : 独自関数からの例外のスロー
更新 : 2007 年 11 月
MFC の例外処理では、MFC やその他のライブラリの関数がスローした例外をキャッチするだけでなく、独自に作成した関数から例外をスローすることもできます。
例外をスローすると、その関数の実行は中断し、最も内側の例外フレームの catch ブロックに直接ジャンプします。例外処理機構は、関数の正規の終了経路をバイパスします。したがって、正常終了時に削除されるメモリ ブロックを削除する必要があります。
例外をスローするには
AfxThrowMemoryException などの MFC ヘルパ関数を使います。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 の例外処理機構ではキャッチできません。 |