Delphi-Exception-Behandlung in C++

Aus RAD Studio
Wechseln zu: Navigation, Suche

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:

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.

Siehe auch