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

MFC 例外処理パラダイムは、MFC または他のライブラリ内で関数によってスローされた例外をキャッチするためだけに使用できます。 ライブラリ コードによってスローされた例外をキャッチするだけでなく、例外条件が発生する可能性がある関数を書いている場合は、独自のコードから例外をスローすることもできます。

例外がスローされると、現在の関数の実行は停止され、内部例外フレームの catch ブロックに直接ジャンプします。 例外メカニズムは、関数からの通常の終了パスをバイパスします。 そのため、通常の終了時に削除されるこれらのメモリ ブロックは、必ず削除するようにします。

例外をスローには

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

    • または
  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 の例外メカニズムをバイパスします。

関連項目

例外処理