次の手順と例では、例外をキャッチして削除する方法を示します。 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 例外マクロからの変換」を参照してください。