例外処理 : 例外のキャッチと削除
更新 : 2007 年 11 月
ここでは、例外のキャッチおよび削除手順と例を示します。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(); }
詳細については、「例外処理 : 古いコードの変換」を参照してください。