次の方法で共有


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

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

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

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

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

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

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

注意

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 例外マクロから変換する

参照

概念

例外処理 (MFC)