次の方法で共有


例外処理 : 例外のキャッチと削除

更新 : 2007 年 11 月

ここでは、例外のキャッチおよび削除手順と例を示します。trycatch、throw の各キーワードの詳細については、「C++ Exception Handling」を参照してください。

例外ハンドラは、処理した例外オブジェクトを削除する必要があります。削除しないと、コードが例外をキャッチするたびにメモリ リークが起こります。

catch ブロックでは、以下の場合に例外を削除する必要があります。

  • catch ブロックが新しい例外をスローしたとき

    同じ例外を再度スローしたときも削除します。

    catch(CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else 
          e->Delete();
    }
    
  • catch ブロックで実行が終了するとき

0e5twxsh.alert_note(ja-jp,VS.90).gifメモ :

CException オブジェクトを削除する場合は、Delete メンバ関数を使います。delete キーワードは使いません。delete キーワードは、例外オブジェクトがヒープ領域にないと、削除できないことがあります。

例外をキャッチ/削除するには

  • try キーワードを使って try ブロックを設定します。例外をスローしうるすべてのプログラム ステートメントを try ブロックの中で実行します。

    catch キーワードを使って catch ブロックを設定します。例外処理用のコードを catch ブロック内に記述します。try ブロック内のコードが catch ステートメントで指定した種類の例外をスローすると、catch ブロック内のコードが実行されます。

    次に、try ブロックと catch ブロックの使い方の例を示します。

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch( CException* e )
    {
       // Handle the exception here.
       // "e" contains information about the exception.
       e->Delete();
    }
    

    例外がスローされると、この例外と例外宣言が一致する最初の catch ブロックに制御が移ります。各種の例外に対応するには、次のように catch ブロックを個別に記述します。

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch( CMemoryException* e )
    {
       // Handle the out-of-memory exception here.
       e->Delete();
    }
    catch( CFileException* e )
    {
       // Handle the file exceptions here.
       e->Delete();
    }
    catch( CException* e )
    {
       // Handle all other types of exceptions here.
       e->Delete();
    }
    

詳細については、「例外処理 : 古いコードの変換」を参照してください。

参照

概念

例外処理 (MFC)