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