次の方法で共有


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

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

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

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

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

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

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

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 例外マクロからの変換」を参照してください。

こちらも参照ください

例外処理