次の手順と例では、例外をキャッチして削除する方法を示します。
try
、catch
、およびthrow
キーワードの詳細については、例外とエラー処理に関する最新の C++ のベスト プラクティスを参照してください。
例外ハンドラーは、例外を削除しないと、そのコードが例外をキャッチするたびにメモリ リークが発生するため、処理する例外オブジェクトを削除する必要があります。
catch
ブロックでは、次の場合に例外を削除する必要があります。
catch
ブロックは新しい例外をスローします。もちろん、同じ例外を再度スローする場合は、例外を削除しないでください。
catch (CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
catch
ブロック内から実行が返されます。
注
CException
を削除するときは、Delete
メンバー関数を使用して例外を削除します。 例外がヒープ上にない場合は失敗する可能性があるため、 delete
キーワードを使用しないでください。
例外をキャッチして削除するには
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 例外マクロからの変換」を参照してください。