次の方法で共有


例外処理 : 独自関数からの例外のスロー

更新 : 2007 年 11 月

MFC の例外処理では、MFC やその他のライブラリの関数がスローした例外をキャッチするだけでなく、独自に作成した関数から例外をスローすることもできます。

例外をスローすると、その関数の実行は中断し、最も内側の例外フレームの catch ブロックに直接ジャンプします。例外処理機構は、関数の正規の終了経路をバイパスします。したがって、正常終了時に削除されるメモリ ブロックを削除する必要があります。

例外をスローするには

  1. 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 番目の割り当てが失敗したときは、例外をスローする前に最初の割り当てブロックを解放する必要があります。両方の割り当てが成功したときは、正常に処理を行い、関数を終了するときにブロックを解放します。

    または

  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;
    }
    
h2sw1zhe.alert_note(ja-jp,VS.90).gifメモ :

MFC の既定の例外処理の対象は、CException オブジェクト (および CException 派生クラスのオブジェクト) へのポインタだけです。上の例でスローした例外は、MFC の例外処理機構ではキャッチできません。

参照

概念

例外処理 (MFC)