例外処理 : MFC マクロと C++ 例外機構の使用
この技術情報では、 MFC の例外処理マクロと C++ 例外処理キーワードの両方を使用するコードの記述の考慮事項について説明します。
ここでは、次のトピックについて説明します。
混合の例外のキーワードとマクロ
try ブロックの内部の catch ブロック
混合の例外のキーワードとマクロ
同じプログラムのマクロ ベースの例外処理と C++ 例外のキーワードを混在させることができます。ただし、例外処理キーワードを使用してコードは、スコープ外に出るとマクロが例外オブジェクトを自動的に削除するため、同じブロックの C++ 例外のキーワードと MFC のマクロを混在させることはできません。詳細については、技術情報 例外: 例外をキャッチし、削除しますを参照してください。
マクロとキーワードとの主な相違点は例外がスコープ外に出るとマクロが 「自動的に」キャッチした例外を削除します。キーワードを使用するコードでは、; catch ブロックでキャッチされた例外は、明示的に削除する必要があります。例外が重複して削除されると例外オブジェクトが削除されない、またはヒープの破損を使用できますと複合マクロと C++ の例外は、キーワード メモリ リークします。
たとえば、次のコードは例外のポインターを無効にします:
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
throw; // Invalid attempt to throw exception
// to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is invalid because
// it was deleted in the inner catch block.
}
END_CATCH
問題は、実行が Catch 「の」ブロックの内部から渡すとき e が削除されたために発生します。THROW ステートメントの代わりに THROW_LAST マクロを使用して Catch 「」の外側のブロックを有効なポインターを受け取るようにします:
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
THROW_LAST(); // Throw exception to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is valid because
// THROW_LAST() was used.
}
END_CATCH
try ブロックの内部の catch ブロック
再スロー Catch ブロックの中にある try ブロックから現在の例外内部できません。次の例は無効です:
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
try
{
throw; // Wrong. Causes e (the exception
// being thrown) to be deleted.
}
catch(CException* exception)
{
exception->ReportError();
}
}
END_CATCH
詳細については、 例外: チェックの例外の内容を参照してください。