例外処理 : 例外のキャッチと削除
次の手順と例は、例外をキャッチ削除する方法を示します。tryの詳細については、 catchと throw のキーワードは、 C++ 例外処理が表示されます。
例外ハンドラーはそのコードが例外をキャッチする場合に例外を削除する失敗によって、メモリ リークが発生するため、処理する例外オブジェクトを削除する必要があります。
catch ブロックは次の場合に例外を削除する必要があります:
catch のブロックは、新しい例外をスローします。
もちろん同じ例外を再びスローする場合、例外は削除しないでください:
catch(CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
catch のブロック内から実行返します。
[!メモ]
CExceptionを削除した場合、例外を削除するに 削除 のメンバー関数を使用します。例外がヒープにない場合は失敗する可能性があるため、 削除(&&D),削除,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(); }
詳細については、 例外: マクロ ベースの例外処理機構からの変換を参照してください。