次の方法で共有


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

次の手順と例は、例外をキャッチ削除する方法を示します。tryの詳細については、 catchと throw のキーワードは、 C++ 例外処理が表示されます。

例外ハンドラーはそのコードが例外をキャッチする場合に例外を削除する失敗によって、メモリ リークが発生するため、処理する例外オブジェクトを削除する必要があります。

catch ブロックは次の場合に例外を削除する必要があります:

  • catch のブロックは、新しい例外をスローします。

    もちろん同じ例外を再びスローする場合、例外は削除しないでください:

    catch(CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else 
          e->Delete();
    }
    
  • catch のブロック内から実行返します。

[!メモ]

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

例外をキャッチし、削除する

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

    catch ブロックを設定するに catch のキーワードを使用します。catch ブロックに例外処理コードを配置します。catch ブロックのコードは try ブロック内のコードが catch ステートメントで指定した型の例外をスローする場合にだけ実行されます。

    次のスケルトンは trycatch ブロックが通常の配置方法を示します:

    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)