Perte des exceptions C++ dans la RTL de Delphi
Remonter à Gestion des exceptions C++ standard
Lorsque la RTL de Delphi rencontre une exception qui n'a pas été générée par Delphi ou qui relève du matériel, elle est mappée en EExternalException. Si les exceptions C++ ne sont pas explicitement interceptées, elles le sont éventuellement par les gestionnaires d'exception Delphi. L'application déclenche alors une exception externe EEFFACE.
Les exceptions C++ standard ainsi que les exceptions C++ définies par l'utilisateur ne peuvent pas être gérées par le runtime de Delphi. Cela signifie que l'utilisation des bibliothèques C++ comme la STL (Standard Template Libraries) ou la bibliothèque C++ standard Dinkumware requiert un peu plus d'attention. Si une exception n'est pas explicitement interceptée et qu'elle est perdue dans le runtime de Delphi, l'application déclenche une Exception externe EEFFACE et elle se bloque.
Exemple
Vous trouverez ci-dessous un court exemple qui illustre comment l'utilisation des bibliothèques STL sans faire attention aux exceptions déclenchées par ces bibliothèques peut provoquer des blocages d'applications.
Voici l'exemple d'une application VCL qui réalise des opérations d'ordre général sur un vecteur d'entiers. Aucune vérification du code n'est effectuée concernant les exceptions C++ déclenchées par les méthodes du vecteur, ce qui provoque le blocage de l'application et le déclenchement d'une exception externe EEFFACE.
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();
// }
}