Ausnahmen: Umwandeln von MFC-Ausnahmemakros
Dies ist ein fortgeschrittenes Thema.
Dieser Artikel beschreibt, wie Sie den vorhandenen Code konvertiert, der mit Microsoft Foundation Class-Makros geschrieben - TRY, CATCH, THROW usw. -. um die C++-Ausnahmebehandlungsschlüsselworte try, catch und throw. Folgende Themen werden behandelt:
Konvertierungsvorteile
Konvertieren von Code mit Ausnahmemakros, um C++-Ausnahmen zu verwenden
Vorteile des Konvertierens
Sie wahrscheinlich nicht, um vorhandenen Code konvertieren, obwohl Sie Unterschiede zwischen den Makroimplementierungen in MFC 3.0 und den Implementierungen in früheren Versionen berücksichtigen sollten. Diese Unterschiede und folgenden Änderungen im Codeverhalten werden in Ausnahmen: Änderungen an den Ausnahme-Makros in Version 3.0 erläutert.
Die Hauptgründe Vorteile des Konvertierens sind:
Code, der die C++-Ausnahmebehandlungsschlüsselworte kompiliert zu einem etwas kleineren EXE oder einem DLL-Datei verwendet.
Die C++-Ausnahmebehandlungsschlüsselworte sind vielseitiger: Sie können Ausnahmen beliebigen Datentyps behandeln, die kopiert werden können (int, float, char, z.), während die Makros Ausnahmen nur der Klasse CException und Klassen, die von dieser abgeleiteten werden behandeln.
Der Hauptunterschied zwischen Makros und den Schlüsselwörtern Code ist mithilfe von Makros "automatisch" wird gelöscht eine abgefangene Ausnahme, wenn die Ausnahme den Bereich verlässt. Code mit der Schlüsselwörter jedoch nicht, müssen Sie eine abgefangene Ausnahme explizit löschen. Weitere Informationen finden Sie im Artikel Ausnahmen: Ausnahmen abfangen und Löschen.
Ein anderer Unterschied ist Syntax. Die Syntax für Makros und Schlüsselwörter weicht in drei Punkten:
Makroargumente und Ausnahmedeklarationen:
Ein CATCH-Makroaufruf hat die folgende Syntax:
CATCH( exception_class, exception_object_pointer_name )
Beachten Sie das Komma zwischen dem Klassennamen und dem Objektzeigernamen.
Die Ausnahmedeklaration für das catch-Schlüsselwort verwendet diese Syntax:
catch( exception_type exception_name**)**
Diese Ausnahmedeklarationsanweisung gibt den Typ der Ausnahme die catch-Blocks-Handles an.
Begrenzung von catch-Blöcken:
Mit Makros beginnt das CATCH (Makro mit den Argumenten) den ersten catch-Block; das Makro AND_CATCH beginnt folgenden catch-Blöcke, und das Makro END_CATCH die Sequenz beendet von catch-Blöcken.
Mit den Schlüsselwörtern beginnt das catch-Schlüsselwort (mit seiner Ausnahmedeklaration) einen catch-Block. Es gibt keine Entsprechung zum END_CATCH-Makro; die catch-Blocks-Enden mit einer schließenden Klammer.
Der Wurfsausdruck:
Die Makros verwenden THROW_LAST, um die aktuelle Ausnahme erneut auslösen. Das Schlüsselwort throw, ohne Argument, hat den gleichen Effekt.
Auf der Konvertierung
So Code mit der Makros konvertieren, um die C++-Ausnahmebehandlungsschlüsselworte zu verwenden
Suchen Sie alle Vorkommen der MFC-Makros TRY, CATCH, AND_CATCH, END_CATCH, THROW und THROW_LAST.
Ersetzen Sie alle Vorkommen der folgenden Makros:
TRY (ersetzen Sie sie durch try)
CATCH (ersetzen Sie sie durch catch)
AND_CATCH (ersetzen Sie sie durch catch)
END_CATCH (Löschen es)
THROW (ersetzen Sie diese durch throw)
THROW_LAST (ersetzen Sie diese durch throw)
Ändern Sie die Makroargumente, damit sie gültige Ausnahmedeklarationen bilden.
Beispielsweise Änderung
CATCH(CException, e)
auf
catch(CException* e)
Ändern Sie den Code in catch-Blöcken, damit er Ausnahmeobjekte ggf. gelöscht. Weitere Informationen finden Sie im Artikel Ausnahmen: Ausnahmen abfangen und Löschen.
Im Folgenden ein Beispiel für Ausnahmebehandlungscodes mithilfe der MFC-Ausnahmemakros. Beachten Sie, dass, da der Code im folgenden Beispiel die Makros verwendet, Ausnahme e automatisch deaktiviert ist:
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
if (m_bPassExceptionsUp)
THROW_LAST();
if (m_bReturnFromThisFunction)
return;
// Not necessary to delete the exception e.
}
END_CATCH
Der Code im folgenden Beispiel verwendet die C++-Ausnahme-Schlüsselworte, daher muss die Ausnahme explizit gelöscht werden:
try
{
// Do something to throw an exception.
AfxThrowUserException();
}
catch(CException* e)
{
if (m_bPassExceptionsUp)
throw;
if (m_bThrowDifferentException)
{
e->Delete();
throw new CMyOtherException;
}
if (m_bReturnFromThisFunction)
{
e->Delete();
return;
}
e->Delete();
}
Weitere Informationen finden Sie unter Ausnahmen: Verwenden MFC-Makros und C++-Ausnahmen.