次の方法で共有


例外処理 : 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

詳細については、 例外: チェックの例外の内容を参照してください。

参照

概念

例外処理 (MFC)