Gestion des exceptions Delphi dans C++

De RAD Studio
Aller à : navigation, rechercher

Remonter à Gestion des exceptions dans C++Builder


Les bibliothèques C++Builder peuvent déclencher des exceptions lorsqu'un événement imprévu se produit. Puisque les bibliothèques C++Builder sont écrites en Delphi, lorsque vous construisez des applications C++ dans C++Builder, vous devez comprendre la façon dont Delphi gère les exceptions pour pouvoir gérer correctement les exceptions émanant de bibliothèques telles que :

Interception des exceptions Delphi

Les exceptions émanant de bibliothèques Delphi doivent être interceptées par référence :

try {

    // Code that uses Delphi libraries.

}
catch (ExceptionClass &E) {

    // Handling of Delphi exceptions of type ExceptionClass.

}

Par exemple, pour intercepter une exception de la classe Exception et afficher son message dans une boîte de dialogue :

catch (Exception &E) {
    ShowMessage(E.Message);
}

Lors de l'interception des exceptions émanant de bibliothèques Delphi :

  • Vous ne pouvez pas utiliser throw pour redéclencher des exceptions Delphi qui ont été interceptées, à moins que vous ne vous trouviez dans le cadre de pile d'interception.
  • Vous n'êtes pas responsable de la libération des objets exception Delphi.
  • Vous devez intercepter explicitement les exceptions émanant de bibliothèques Delphi dans les applications graphiques C++Builder.
    Remarque : Si vous n'interceptez pas explicitement ces exceptions, le gestionnaire d'exception par défaut du framework GUI de votre application les intercepte et votre application déclenche une exception externe EEFFACE.

Les constructeurs Delphi peuvent déclencher des exceptions

Les destructeurs C++ sont appelés pour les classes de base et les membres totalement construits.
Les destructeurs de classes de base Delphi sont appelés même si l'objet ou la classe de base n'est pas totalement construit.

Destruction d'objets, Exceptions déclenchées dans les constructeurs fournit un exemple montrant ce qui se produit si une exception est déclenchée lors de la construction d'un objet.

Déclenchement des exceptions Delphi

Vous devez déclencher des instances de classes d'exception Delphi émanant de code C++ par valeur :

throw ExceptionClass();

Par exemple, pour déclencher une exception de classe Exception et définir une erreur Message :

throw Exception("My error message");

Classes d'exception Delphi communes dans C++Builder

C++Builder comprend un ensemble de classes d'exception incorporées pour gérer automatiquement les erreurs de division par zéro, les erreurs d'E/S, les transtypages incorrects et de nombreuses autres conditions d'exception. Pour intercepter ces exceptions, votre application doit établir un lien avec la RTL. Si vous souhaitez gérer ce type de problème alors que votre application n'établit pas de lien avec la RTL, vous devez utiliser les API de gestion des signaux de chaque système d'exploitation pris en charge par votre application, comme la gestion structurée des exceptions (SEH, Structured Exception Handling) sous Windows.

Par ailleurs, la rubrique Support du langage pour les bibliothèques RAD Studio (C++) décrit les subtiles différences du langage susceptibles de provoquer des exceptions.

Classes d'exception RTL communes

Les exceptions de la RTL incluent les violations d'accès, les erreurs arithmétiques de nombres entiers, les erreurs arithmétiques de nombres flottants, les débordements de pile et les interruptions Ctrl+C.

Classe d'exception Description
EAbort Interrompt une séquence d'événements sans afficher de boîte de dialogue de message d'erreur.
EAccessViolation Vérifie la présence d'erreurs d'accès mémoire non valide.
EBitsError Empêche les tentatives non valides d'accès à un tableau booléen.
EComponentError Signale une tentative non valide d'enregistrement ou de renommage d'un composant.
EConvertError Indique des erreurs de conversion d'objets ou de chaînes.
EDivByZero Intercepte les erreurs de division par zéro des entiers.
EExternalException Indique un code d'exception non reconnu.
EInOutError Représente une erreur d'E/S de fichier.
EIntOverflow Spécifie des calculs d'entiers dont les résultats sont trop élevés pour le registre alloué.
EInvalidCast Vérifie l'existence de transtypages illégaux.
EInvalidOperation Se produit quand des opérations non valides sont tentées sur un composant.
EInvalidPointer Se produit suite à des opérations de pointeur non valide.
EOleError Spécifie des erreurs d'automation OLE.
EPropertyError Se produit suite à des tentatives infructueuses de définition de la valeur d'une propriété.
ERangeError Indique que la valeur d'un entier est trop élevée pour le type déclaré auquel il est assigné.
ERegistryException Spécifie des erreurs de registre.
EZeroDivide Intercepte des erreurs de division par zéro à virgule flottante.

Classes d'exception des accès aux données communes

Classe d'exception Description
EDatabaseError Spécifie une erreur d'accès à une base de données.

Classes d'exception VCL communes

Exceptions de la VCL :

Classe d'exception Description
EDBEditError Intercepte des données incompatibles avec un masque spécifié.
EInvalidGraphic Indique une tentative d'utilisation d'un format de fichier graphique non reconnu.
EMenuError Implique un problème avec un élément de menu.
EOleCtrlError Détecte des problèmes de liaison aux contrôles ActiveX.

Classes d'exception personnalisées qui descendent des classes Delphi

Vous pouvez déclarer une nouvelle classe d'exception en créant un descendant de classe Exception et en créant autant de constructeurs que nécessaire (ou en copiant les constructeurs depuis une classe existant dans Sysutils.hpp).

Considérations de portabilité

Plusieurs bibliothèques d'exécution (RTL) sont fournies avec C++Builder. La plupart des bibliothèques appartiennent à des applications C++Builder, mais l'une d'entre elles (cw32mt.lib) est la RTL multithread normale qui ne contient aucune référence à la VCL. Cette RTL est fournie pour la prise en charge des applications existantes pouvant faire partie d'un projet, mais ne dépendant pas de la VCL. Cette RTL ne prend pas en charge l'interception des exceptions du système d'exploitation, car ces objets d'exception sont dérivés de TObject et nécessitent que des parties de la VCL soient liées dans votre application.

La bibliothèque cp32mt.lib (bibliothèque d'exécution multithread) fournit une gestion de la mémoire et une gestion des exceptions avec la VCL.

Deux bibliothèques d'importation (cw32mti.lib et cp32mti.lib) vous permettent d'utiliser la DLL RTL. Utilisez cp32mti.lib pour la prise en charge des exceptions de la VCL.

Voir aussi