Weitergabe von C++-Exceptions an die Delphi-RTL

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Standard-Exception-Behandlung in C++


Wenn die Delphi-RTL auf eine Exception trifft, die nicht von Delphi erzeugt oder hardwarebezogen ist, wird die Exception als eine EExternalException zugeordnet. Werden C++-Exceptions nicht explizit abgefangen, werden sie irgendwann von Delphi-Exception-Behandlungsroutinen abgefangen, und die Anwendung löst deshalb die externe Exception EEFFACE aus.

C++-Standard-Exceptions und benutzerdefinierte C++-Exceptions können von der Delphi-Laufzeit nicht behandelt werden. Das bedeutet, dass für die Verwendung der C++-Bibliotheken, wie Standard-Template-Bibliothek (Standard Template Libraries, STL) oder Dinkumware Standard-C++-Bibliothek, etwas mehr Aufmerksamkeit erforderlich ist. Wird eine Exception nicht explizit abgefangen, wird sie an die Delphi-Laufzeit weitergegeben, und die Anwendung löst die externe Exception EEFFACE aus und stürzt ab.

Beispiel

Das folgende Beispiel zeigt, wie die Verwendung der STL-Bibliotheken ohne Vorkehrungen für die von diesen Bibliotheken ausgelösten Exceptions zum Absturz von Anwendungen führen kann.

Dieses Beispiel ist eine VCL-Anwendung, die allgemeine Operationen für einen Vektor von Integerwerten ausführt. Der Code wird nicht auf von Vektormethoden ausgelöste C++-Exceptions überprüft, daher stürzt die Anwendung ab und löst die externe Exception EEFFACE aus.

void __fastcall TForm1::Button3Click(TObject *Sender) {
	std::vector<int> vect;
	vect.push_back(112);
	vect.push_back(222);
	Label1->Caption = vect.at(2);
	// the code does not check for std::out_of_range exception
	// correct code will be  :
//	try {
//		Label1->Caption = vect.at(2);
//	}
//	catch (std::out_of_range& e) {
//		Label1->Caption = e.what();
//	}
}

Siehe auch