Ausnahmen: Verwenden von MFC-Makros und C++-Ausnahmen

In diesem Artikel werden Überlegungen zum Schreiben von Code erläutert, der sowohl die MFC-Ausnahmebehandlungsmakros als auch die C++-Ausnahmebehandlung Schlüsselwort (keyword)s verwendet.

In diesem Artikel werden die folgenden Themen behandelt:

Kombinieren von Ausnahmestichwörtern und Makros

Sie können MFC-Ausnahmemakros und C++-Ausnahme Schlüsselwort (keyword) im selben Programm kombinieren. Sie können jedoch keine MFC-Makros mit C++-Ausnahme Schlüsselwort (keyword) im selben Block kombinieren, da die Makros Ausnahmeobjekte automatisch löschen, wenn sie außerhalb des Gültigkeitsbereichs gehen, während code, der die Ausnahmebehandlung Schlüsselwort (keyword)s nicht verwendet. Weitere Informationen finden Sie im Artikel Ausnahmen: Abfangen und Löschen von Ausnahmen.

Der Standard Unterschied zwischen den Makros und den Schlüsselwort (keyword) besteht darin, dass die Makros "automatisch" eine abgefangene Ausnahme löschen, wenn die Ausnahme außerhalb des Gültigkeitsbereichs liegt. Code, der die Schlüsselwort (keyword)s verwendet, nicht. Ausnahmen, die in einem Catch-Block erfasst werden, müssen explizit gelöscht werden. Das Mischen von Makros und C++-Ausnahme Schlüsselwort (keyword) kann zu Speicherverlusten führen, wenn ein Ausnahmeobjekt nicht gelöscht wird, oder heapbeschädigung, wenn eine Ausnahme zweimal gelöscht wird.

Mit dem folgenden Code wird beispielsweise der Ausnahmezeiger ungültig:

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

Das Problem tritt auf, weil e gelöscht wird, wenn die Ausführung den "inneren" CATCH-Block übergibt. Wenn Sie das makro THROW_LAST anstelle der THROW-Anweisung verwenden, erhält der CATCH-Block "outer" einen gültigen Zeiger:

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

Versuchen Sie Blöcke innerhalb von Catch-Blöcken

Sie können die aktuelle Ausnahme nicht innerhalb eines try Blocks, der sich innerhalb eines CATCH-Blocks befindet, erneut auslösen. Das folgende Beispiel ist ungültig:

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

Weitere Informationen finden Sie unter Ausnahmen: Untersuchen von Ausnahmeinhalten.

Siehe auch

Ausnahmebehandlung