Delphi-Exception-Behandlung in C++
Nach oben zu Exception-Behandlung in C++Builder
C++Builder-Bibliotheken können Exceptions auslösen, wenn etwas Unerwartetes geschieht. Da C++Builder-Bibliotheken in Delphi geschrieben sind, müssen Sie beim Erstellen von C++-Anwendungen mit C++Builder wissen, wie Exceptions in Delphi behandelt werden, damit Sie mit Exceptions aus Bibliotheken richtig umgehen können, wie:
- Der RTL
- FireMonkey
- VCL
Inhaltsverzeichnis
Abfangen von Delphi-Exceptions
Exceptions aus Delphi-Bibliotheken müssen per Referenz abgefangen werden:
try {
// Code that uses Delphi libraries.
}
catch (ExceptionClass &E) {
// Handling of Delphi exceptions of type ExceptionClass.
}
So wird beispielsweise eine Exception der Klasse Exception abgefangen und die zugehörige Meldung in einem Dialogfeld angezeigt:
catch (Exception &E) {
ShowMessage(E.Message);
}
Beim Abfangen von Exceptions aus Delphi-Bibliotheken gilt Folgendes:
- Mit throw können Delphi-Exception, die abgefangen wurden, nur im abfangenden Stack-Frame erneut ausgelöst werden.
- Sie sind nicht für die Freigabe des Delphi-Exception-Objekts verantwortlich.
- Sie müssen Exceptions aus Delphi-Bibliotheken in grafischen C++Builder-Anwendungen explizit abfangen.
- Hinweis: Wenn diese Exceptions nicht abgefangen werden, fängt die Standard-Exception-Behandlungsroutine des GUI-Frameworks der Anwendung sie ab, und die Anwendung generiert die Fehlermeldung Externe Exception EEFFACE.
Delphi-Konstruktoren können Exceptions auslösen
C++-Destruktoren werden für vollständig erstellte Member und Basisklassen aufgerufen.
Delphi-Basisklassendestruktoren werden auch aufgerufen, wenn das Objekt oder die Basisklasse nicht vollständig erstellt wurde.
Objektfreigabe, Von Konstruktoren ausgelöste Exceptions enthält ein Beispiel, das die Folgen einer während der Objektfreigabe ausgelösten Exception zeigt.
Auslösen von Delphi-Exceptions
Instanzen der Delphi-Exception-Klassen müssen von C++ per Wert ausgelöst werden:
throw ExceptionClass();
So lösen Sie beispielsweise eine Exception der Klasse Exception aus und definieren in Message eine Fehlermeldung:
throw Exception("My error message");
Gängige Delphi-Exception-Klassen in C++Builder
C++Builder enthält eine umfangreiche Sammlung integrierter Exception-Klassen für die automatische Behandlung von Fehlern bei der Division durch Null und bei der Dateiein- und -ausgabe, für unzulässige Typumwandlungen und viele andere Ausnahmebedingungen. Um diese Exceptions abfangen zu können, muss die Anwendung mit der RTL gelinkt werden. Wenn die Anwendung nicht mit der RTL gelinkt wird, sollten Sie die Signalbehandlungs-APIs der von der Anwendung unterstützten Betriebssysteme verwenden, z. B. Structured Exception Handling unter Windows.
Unter Sprachunterstützung für die RAD Studio-Bibliotheken (C++) finden Sie darüber hinaus eine Beschreibung feiner Sprachunterschiede, die Exceptions verursachen können.
Gängige -RTL-Exception-Klassen
Zu RTL-Exceptions gehören Zugriffsverletzungen, Fehler bei Integer-Berechnungen, Fehler bei Gleitkomma-Berechnungen, Stack-Überlauf und Unterbrechungen durch Strg+C.
Exception-Klasse | Beschreibung |
---|---|
EAbort | Bricht eine Ereignisfolge ab, ohne ein Dialogfeld mit einer Fehlermeldung anzuzeigen. |
EAccessViolation | Prüft auf Fehler, die aus einem unzulässigen Speicherzugriff resultieren. |
EBitsError | Verhindert unzulässige Versuche, auf ein boolesches Array zuzugreifen. |
EComponentError | Tritt bei einem unzulässigen Versuch auf, eine Komponente zu registrieren oder umzubenennen. |
EConvertError | Gibt Fehler bei der String- oder Objektumwandlung an. |
EDivByZero | Fängt Fehler ab, die sich aus einer Division einer ganzen Zahl durch Null ergeben. |
EExternalException | Bezeichnet einen unbekannten Exception-Code. |
EInOutError | Repräsentiert einen Datei-Ein-/Ausgabefehler. |
EIntOverflow | Gibt Integer-Berechnungen an, deren Ergebnisse zu groß für das zugewiesene Register sind. |
EInvalidCast | Prüft auf unzulässige Typumwandlungen. |
EInvalidOperation | Tritt bei dem Versuch auf, mit einer Komponente eine unzulässige Operation durchzuführen. |
EInvalidPointer | Resultiert aus unzulässigen Operationen mit Zeigern. |
EOleError | Gibt OLE-Automatisierungsfehler an. |
EPropertyError | Tritt auf, wenn der Versuch scheitert, den Wert einer Eigenschaft zu setzen. |
ERangeError | Weist auf einen Integer-Wert hin, der für den deklarierten Typ, dem er zugewiesen ist, zu groß ist. |
ERegistryException | Gibt Registrierungsfehler an. |
EZeroDivide | Fängt Fehler ab, die aus der Division eines Gleitkommawertes durch Null resultieren. |
Gängige Datenzugriffs-Exception-Klassen
Exception-Klasse | Beschreibung |
---|---|
EDatabaseError | Gibt einen Fehler beim Datenbankzugriff an. |
Gängige VCL-Exception-Klassen
VCL-Exceptions:
Exception-Klasse | Beschreibung |
EDBEditError | Fängt Daten ab, die nicht mit einer angegebenen Maske kompatibel sind. |
EInvalidGraphic | Gibt einen Versuch an, mit einem unbekannten Grafikdateiformat zu arbeiten. |
EMenuError | Weist auf ein Problem mit einem Menüeintrag hin. |
EOleCtrlError | Erkennt Probleme bei der Verknüpfung mit ActiveX-Steuerelementen. |
Benutzerdefinierte Exception-Klassen, die von Delphi-Klassen abgeleitet sind
Sie können eine neue Exception-Klasse deklarieren, indem Sie sie vom Typ Exception ableiten und die erforderliche Anzahl an Konstruktoren erstellen (oder die Konstruktoren aus einer vorhandenen Klasse in der Unit Sysutils.hpp
kopieren).
Aspekte der Portabilität
Mit C++Builder werden mehrere Laufzeitbibliotheken (Runtime Libraries, RTL) ausgeliefert. Die meisten davon betreffen C++Builder-Anwendungen, aber die Bibliothek cw32mt.lib ist die normale Multithread-RTL, die keine Referenzen zur VCL enthält. Diese RTL dient der Unterstützung von veralteten Anwendungen, die möglicherweise Teil eines Projekts sind, aber nicht von der VCL abhängen. Diese RTL unterstützt das Abfangen von Betriebssystem-Exceptions nicht, weil diese Exception-Objekte von TObject abgeleitet sind und dafür Teile der VCL in Ihre Anwendung gelinkt werden müssten.
Sie können die Multithread-Laufzeitbibliothek cp32mt.lib verwenden, die die Speicherverwaltung und die Exception-Behandlung mit der VCL bereitstellt.
Zur Verwendung der RTL-DLL können Sie zwei Importbibliotheken, cw32mti.lib und cp32mti.lib, einsetzen. Verwenden Sie cp32mti.lib zur Unterstützung von VCL-Exceptions.