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