Weitergabe von C++-Exceptions an die Delphi-RTL
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();
// }
}