例外処理 : 例外のキャッチと削除
ここでは、例外のキャッチおよび削除手順と例を示します。 try、catch、throw の各キーワードの詳細については、「C++ Exception Handling」を参照してください。
例外ハンドラーは、処理した例外オブジェクトを削除する必要があります。削除しないと、コードが例外をキャッチするたびにメモリ リークが起こります。
catch ブロックでは、以下の場合に例外を削除する必要があります。
catch ブロックが新しい例外をスローしたとき
同じ例外を再度スローしたときも削除します。
catch(CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
catch ブロックで実行が終了するとき
注意
CException オブジェクトを削除する場合は、Delete メンバー関数を使います。 delete キーワードは使いません。delete キーワードは、例外オブジェクトがヒープ領域にないと、削除できないことがあります。
例外をキャッチ/削除するには
try キーワードを使って try ブロックを設定します。 例外をスローしうるすべてのプログラム ステートメントを try ブロックの中で実行します。
catch キーワードを使って catch ブロックを設定します。 例外処理用のコードを catch ブロック内に記述します。 try ブロック内のコードが catch ステートメントで指定した種類の例外をスローすると、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 例外マクロから変換する。