Sur la gestion des exceptions dans Delphi Gestion des exceptions

Voici un fait intéressant: non code est sans erreur - en fait, un certain code est plein d'erreurs à dessein.

Qu'est-ce qu'une erreur dans une application? Une erreur est une solution incorrectement codée à un problème. Tels sont erreurs logiques cela pourrait conduire à de mauvais résultats de fonction où tout semble bien monté mais le résultat de l'application est complètement inutilisable. Avec des erreurs logiques, un application pourrait ou pourrait ne pas fonctionner.

Les exceptions peuvent inclure des erreurs dans votre code où vous essayez de diviser des nombres par zéro, ou vous essayez d'utiliser des blocs de mémoire libérés ou essayez de fournir des paramètres incorrects à une fonction. Cependant, une exception dans une application n'est pas toujours une erreur.

Exceptions et classe d'exceptions

Les exceptions sont des conditions spéciales qui nécessitent une manipulation spéciale. Lorsqu'une condition de type erreur se produit, le programme lève une exception.

Vous (en tant que rédacteur d'application) gérerez les exceptions pour rendre votre application plus sujette aux erreurs et pour répondre à la condition exceptionnelle.

instagram viewer

Dans la plupart des cas, vous vous trouverez être le rédacteur d'application et également le rédacteur de bibliothèque. Vous devez donc savoir comment lever des exceptions (depuis votre bibliothèque) et comment les gérer (depuis votre application).

L'article sur gestion des erreurs et exceptions fournit des directives de base sur la façon de se prémunir contre les erreurs en utilisant les blocs protégés try / except / end et try / enfin / end pour répondre ou gérer des conditions exceptionnelles.

Un simple essai / à l'exception des blocs de garde ressemble à:


essayer
ThisFunctionMightRaiseAnException ();
sauf// gère toutes les exceptions levées dans ThisFunctionMightRaiseAnException () ici
fin;

ThisFunctionMightRaiseAnException peut avoir, dans son implémentation, une ligne de code comme


élever Exception. Créer ('condition spéciale!');

L'exception est une classe spéciale (l'une des rares sans T devant le nom) définie dans l'unité sysutils.pas. L'unité SysUtils définit plusieurs descendants d'exception à usage spécial (et crée ainsi une hiérarchie de classes d'exception) comme ERangeError, EDivByZero, EIntOverflow, etc.

Dans la plupart des cas, les exceptions que vous géreriez dans le bloc protégé try / except ne seraient pas de l'exception (de base) mais d'une classe descendante d'exception spéciale définie dans la VCL ou dans la bibliothèque que vous êtes en utilisant.

Gestion des exceptions à l'aide de Try / Except

Pour intercepter et gérer un type d'exception, vous devez créer un gestionnaire d'exceptions "on type_of_exception do". Le "on exception do" ressemble à peu près à la déclaration de cas classique:


essayer
ThisFunctionMightRaiseAnException;
sauf EZeroDivide dobegin// quelque chose lors de la division par zérofin;
sur EIntOverflow dobegin// quelque chose quand le calcul d'entier est trop grandfin;
elsebegin// quelque chose quand d'autres types d'exceptions sont levésfin;
fin;

Notez que la partie else saisirait toutes les (autres) exceptions, y compris celles dont vous ne savez rien. En général, votre code ne doit gérer que les exceptions que vous savez réellement gérer et vous attendez à être levées.

De plus, vous ne devriez jamais "manger" une exception:


essayer
ThisFunctionMightRaiseAnException;
sauf
fin;

Manger l'exception signifie que vous ne savez pas comment gérer l'exception ou que vous ne voulez pas que les utilisateurs voient l'exception ou quoi que ce soit entre les deux.

Lorsque vous gérez l'exception et que vous en avez besoin de plus de données (après tout, c'est une instance d'une classe) plutôt que du type d'exception que vous pouvez faire:


essayer
ThisFunctionMightRaiseAnException;
sauf E: exception dobegin
ShowMessage (E.Message);
fin;
fin;

Le "E" dans "E: Exception" est une variable d'exception temporaire de type spécifié après le caractère de colonne (dans l'exemple ci-dessus la classe d'exception de base). En utilisant E, vous pouvez lire (ou écrire) des valeurs sur l'objet d'exception, comme obtenir ou définir la propriété Message.

Qui libère l'exception?

Avez-vous remarqué que les exceptions sont en fait des instances d'une classe descendant d'Exception? Le mot clé raise lève une instance de classe d'exception. Ce que vous créez (l'instance d'exception est un objet), vous besoin de libérer. Si vous (en tant que rédacteur de bibliothèque) créez une instance, l'utilisateur de l'application la libérera-t-il?

Voici le Delphes magie: la gestion d'une exception détruit automatiquement l'objet d'exception. Cela signifie que lorsque vous écrivez le code dans le bloc "except / end", il libère la mémoire d'exception.

Alors, que se passe-t-il si ThisFunctionMightRaiseAnException lève réellement une exception et que vous ne la gérez pas (ce n'est pas la même chose que de la "manger")?

Qu'en est-il lorsque le nombre / 0 n'est pas géré?

Lorsqu'une exception non gérée est levée dans votre code, Delphi gère à nouveau par magie votre exception en affichant la boîte de dialogue d'erreur à l'utilisateur. Dans la plupart des cas, cette boîte de dialogue ne fournira pas suffisamment de données pour que l'utilisateur (et enfin vous) comprenne la cause de l'exception.

Ceci est contrôlé par la boucle de message de niveau supérieur de Delphi où tout les exceptions sont en cours de traitement par l'objet Application global et sa méthode HandleException.

Pour gérer les exceptions globalement et afficher votre propre boîte de dialogue plus conviviale, vous pouvez écrire du code pour les TApplicationEvents. Gestionnaire d'événements OnException.

Notez que l'objet Application global est défini dans l'unité Forms. TApplicationEvents est un composant que vous pouvez utiliser pour intercepter les événements de l'objet Application global.

instagram story viewer