Ausnahmen: Verwenden von MFC-Makros und C++-Ausnahmen
In diesem Artikel werden Überlegungen zum Schreiben von Code, der die MFC-Ausnahmebehandlungs von Makros und die C++-Ausnahmebehandlungs Schlüsselwörter verwendet.
Dieser Artikel enthält die folgenden Themen:
Mixing ausnahme Schlüsselwörter und - Makros
Try-Blöcke innerhalb der catch-Blöcke
Mixing-Ausnahme-Schlüsselworte und Makros
Sie können MFC-Ausnahme Makros und C++-Ausnahme-Schlüsselworte im selben Programm miteinander kombinieren.Sie können jedoch MFC-Makros mit C++-Ausnahme-Schlüsselworten im gleichen Block nicht kombinieren, da die Makros Ausnahmeobjekte automatisch gelöscht, wenn sie den Gültigkeitsbereich verlassen, während Code mithilfe der Schlüsselwörter zur Ausnahmebehandlung nicht vorhanden ist.Weitere Informationen finden Sie im Artikel Ausnahmen: Ausnahmen abfangen und Löschen.
Der Hauptunterschied zwischen Makros und den Schlüsselwörtern besteht darin, dass die Makros" Bezeichnung "Automatically eine abgefangene Ausnahme löschen, wenn sie den Bereich verlässt.Code mithilfe der Schlüsselwörter ist dies nicht der Fall. Ausnahmen, die in einem catch-Block abgefangen werden, müssen explizit gelöscht werden.Mixing Makros und C++-Ausnahme-Schlüsselworte können Speicherverluste, wenn ein Ausnahmeobjekt oder Heap nicht gelöscht wird, wenn eine Ausnahme auslösen, beschädigung zweimal gelöscht wird.
Der folgende Code beispielsweise ungültig macht den Zeiger Ausnahme:
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 aus dem inneren " CATCH " - Block übergeben wird.Verwenden des THROW_LAST anstelle von Makros THROW-Anweisung veranlasst den "äußeren" CATCH-Block einen gültigen Zeiger zu erhalten:
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-Blöcke innerhalb der Catch-Blöcke
Sie können die aktuelle Ausnahme nicht innerhalb eines try-Block erneut auslösen, die in einem CATCH-Blocks ist.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 ausnahme-Inhalte.