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

次の手順と例は、例外をキャッチおよび削除する方法を示しています。 trycatch、および throw キーワードの詳細については、「例外とエラー処理に関する Modern C++ のベスト プラクティス」を参照してください。

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

catch ブロックでは、次のときに例外を削除する必要があります。

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

    もちろん、同じ例外を再度スローする場合は例外を削除してはいけません。

    catch (CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else
          e->Delete();
    }
    
  • catch ブロック内から実行が返されたとき。

Note

CException を削除する場合は、Delete メンバー関数を使用して例外を削除してください。 例外がヒープ上にない場合は失敗する可能性があるため、delete キーワードは使用しないでください。

例外をキャッチおよび削除するには

  1. try キーワードを使用して try ブロックを設定します。 例外をスローする可能性のあるプログラム ステートメントを try ブロック内で実行します。

    catch キーワードを使用して catch ブロックを設定します。 例外処理コードを catch ブロックに配置します。 catch ブロック内のコードは、try ブロック内のコードが 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 例外マクロからの変換」を参照してください。

関連項目

例外処理