šHgeocities.com/Vienna/Stage/4793/excp8.htmgeocities.com/Vienna/Stage/4793/excp8.htmdelayedxŁÕJ’’’’’’’’’’’’’’’’’’’’Č0¤£L!OKtext/htmlĻBmoL!’’’’b‰.HMon, 18 Dec 2000 15:42:14 GMTčMozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)en, *ŲÕJL! MFC Exceptions

Zurück ] Nach oben ] Weiter ]

 

MFC Exceptions

Die MFC-Exception sind veraltet und Microsoft empfiehlt selbst, die Standard C++ Exceptions wo immer möglich zu nutzen.

Trotzdem gibt immer noch Programme, die diese Makroerweiterung nutzen, so daß man wenigstens das Grundprinzip kennen sollte. Außerdem werden dieses MFC-Klassen wegen der Abwärtskompatibilität von Microsoft voll unterstützt.

Seit der Version 3.0 nutzt Microsoft den Standard C++ Mechanismus in der MFC. Deswegen muß auch der Schalter "Enable exception handling" in den Project Settings aktiviert sein, sobald man mit der MFC arbeitet. Hier ergibt sich ein Seiteneffekt zu SEH, da man manchmal für SEH diesen Schalter ausschaltet (s.o.). Man kann also in bestimmten Situationen nicht beide Mechanismen nutzen. Microsoft sagt sogar, daß sich diese Mechanismen komplett ausschließen und nicht in einem Programm zusammen verwendet werden können.

Die Erweiterung in den MFC definiert eine Familie von Makros:

  • TRY

  • CATCH, AND_CATCH, und END_CATCH

  • THROW und THROW_LAST

Diese Makros entsprechen den C++ Exception Schlüsselwörtern try, catch und throw.

Darüber hinaus bietet MFC eine Klassenhierarchie von Exceptions, die alle den Namen CXXXException haben und von der abstrakten Basisklasse CException abgeleitet sind. Dies ist eine Analogie zu der Hierarchie, die Standard C++ bietet, mit der Einschränkung, daß nur von CException abgeleitete Klassen behandelt werden können.
Für jede Klasse CXXXException gibt eine Hilfsfunktion AfxThrowXXXException die das entsprechende Objekt konstruiert, initialisiert und wirft. Generell sollte man diese Funktion für die bereitgestellten Klassen nutzen und das Makro THROW für eigene Klassen.

Es gelten folgende Programmierrichtlinien:

  • Code, der Exceptions wirft, wird von einem TRY-Block umgeben

  • Exceptions werden erkannt und behandelt, indem sie geCATCHed werden. Diese Handler fangen allerdings nicht Objekt, sondern Pointer auf bereits existierende Objekte. MFC erkennt diese dann anhand ihrem C++ dynamic type.

  • An einem TRY-Block können mehrerer CATCH-Handler angehängt werden, die jeweils einen anderen Typ von Exception fangen. Der erste Handler nutzt das Makro CATCH. Alle folgenden in diesem Block nutzen AND_CATCH. Abgeschlossen wir die CATCH-Kette mit einem END_CATCH.

  • Die MFC selbst wirft Exceptions aus. Zusätzlich kann man selbst mit den Afx-Hilfsfunktionen bzw. mit dem Makro THROW eine Exception werfen. In einem Exceptionhandler kann mit THROW_LAST diese Exception weitergeworfen werden.

  • MFC unterstützt nur die terminating exceptions.

  • Hinweis: Im Gegensatz zum Standard C++ werden die Objekte nach dem Handler automatisch vernichtet. Deswegen sollte man die beiden Mechanismen nicht nutzen, um das gleiche Objekt abzufangen. Sonst riskiert man memory leaks, Referenzen auf nicht mehr vorhandene Objekte bzw. den ( sicherlich zum Scheitern verurteilten ) Versuch, das Objekt mehrmals freizugeben.

"The Root of all evil" - CException

CException

Constructs a Cexception object.

Delete

Deletes a CException object.

GetErrorMessage

Retrieves the message describing an exception.

ReportError

Reports an error message in a message box to the user.