例外処理 : MFC マクロと C++ 例外機構の使用
ここでは、MFC の例外処理マクロと C++ 例外処理キーワードの両方を使用するコードを記述するときの考慮事項について説明します。
ここでは、次のトピックについて説明します。
混乱の exception キーワードおよびマクロ
catch ブロック内の Try ブロック
混乱の exception キーワードおよびマクロ
同じプログラムのマクロ ベースの例外処理機構と 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 の「internal」ブロックから渡すとき 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
Catch ブロック内の Try ブロック
再スロー 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
詳細については、「例外: 検証の例外の内容」を参照してください。