Historique des mises à jour : n°2
Heure de mise à jour : 2001-10-21 02:42
Mis à jour par : Musicwind®
Note de mise à jour : format modifié.
Historique des mises à jour : n° 1
Heure de mise à jour : 2001-10-19 21:15
Mis à jour par : Musicwind®
Notes de mise à jour : créé.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~
Préface : Je suis immergé dans Delphi depuis plus de trois ans, mais chaque fois que je lis la documentation d'aide de Delphi, j'y gagne encore beaucoup, donc je ne peux m'empêcher de soupirer devant l'étendue de Delphi ! Même si j’ai honte, je vais trier certaines de mes expériences et gains, et partager mes encouragements avec ceux d’entre vous qui sont aussi arrogants et moins bien informés que moi.
1. Qu'est-ce qu'une exception silencieuse ? (Pourquoi pas Le Silence des agneaux ? ;- ))
Les exceptions silencieuses, c'est-à-dire Slient Exceptions , font référence au type d'exception qui ne provoque pas d'invites de message gênantes par défaut : EAbort . En Pascal Objet, la classe d'exception EAbort est la classe ancêtre de toutes les classes d'exception silencieuses (et EAbort hérite d'Exception). L'activation d'un EAbort entraînera l'arrêt d'un module d'exécution jusqu'à ce que le module de gestion des exceptions le plus externe l'intercepte, mais ne provoquera pas l'apparition d'une boîte de message avec un signe d'arrêt rouge. Reportez-vous au code suivant :
essayer
ShowMessage('Bonjour1');
Raise EAbort.Create('Abandonner');
ShowMessage('Bonjour2');
sauf
sur E : Exception faire
showmessage('En cas d'exception');
fin;
Le résultat de l'exécution affiche deux boîtes de message, l'une est "Hello1" et l'autre est "On Exception". Cela montre qu'EAbort fonctionne, car il ignore l'instruction "ShowMessage('Hello2')" ; en même temps, la boîte de message "Abandonner" n'apparaît pas, ce qui confirme également la fonctionnalité de la classe d'exception EAbort qui ne contient aucune boîte de dialogue. apparaît. (Cela est également vrai lors de la conception) et la boîte de message "On Exception" indique que même si EAbort peut être une anomalie différente des exceptions ordinaires, cela ne nous empêche pas d'utiliser l'ancienne instruction Try-Except pour la détecter. .
2. Pourquoi utiliser EAbort ?
EAbort est utile dans certaines situations. Par exemple, lorsque nous devons terminer une opération mais que nous ne voulons pas que les utilisateurs le remarquent (nous ne voulons pas qu'ils voient la boîte de message d'exception par défaut). Bien sûr, pour obtenir le même effet, vous pouvez également utiliser des exceptions ordinaires (par exemple, utilisez le modèle de phrase Try-Except, placez le code dans la section Try, déclenchez une exception si vous devez terminer l'opération et n'écrivez pas n'importe quel code dans la section Sauf), mais rien de tout cela n'est aussi simple et direct que l'utilisation d'EAbort.
3. Y a-t-il quelque chose de plus simple ? --Utilisation du processus d'abandon
Abort, un processus défini dans l'unité SysUtils, nous permet d'utiliser facilement EAbort. Consultez le code source d'implémentation d'Abort :
PRécédure Abandonner ;
fonction ReturnAddr : pointeur ;
asme
MOUVEMENT EAX,[EBP + 4]
fin;
commencer
augmenter EAbort.Create(SOperationAborted) à ReturnAddr ;
fin;
SOperationAborted ici est généralement "Opération interrompue".
4. Lever le voile – principe de mise en œuvre
Peut-être que, comme moi, vous êtes curieux de savoir pourquoi EAbort est silencieux. Qu'est-ce que Delphi a fait à EAbort en interne ? Découvrons ensemble.
Ouvrez un nouveau projet, cliquez sur Rechercher dans les fichiers, entrez le mot-clé « EAbort », puis sélectionnez le bouton radio Rechercher dans les répertoires et définissez la zone d'édition Masque de fichier dans les options de répertoire de recherche sur le nom du répertoire où se trouve le code source Delphi (tel que comme le mien Oui : D:Program FilesBorlandDelphi6Source), et n'oubliez pas de cocher Inclure le sous-répertoire. Enfin, cliquez sur "OK" pour lancer la recherche.
En conséquence, nous avons constaté qu’il y a jusqu’à 17 endroits dans le code source de Delphi liés à EAbort. À l'exception des deux déclarations d'EAbort et de quelques instructions de commentaire dans l'unité Sysutils, nous avons constaté que la plupart du code est similaire à :
si ExceptObject est EAbort alors
ainsi que:
sinon (E est EAbort) alors
etc.
Tous bénéficient d'un traitement spécial pour EAbort basé sur RTTI - il s'avère que la mise en œuvre d'EAbort est aussi simple que cela !
Les deux unités dignes d'attention sont : Forms (la version Linux est QForms) et AppEvnts. Il est plus facile de trouver la réponse à la question dans le code de la première. Voir le code source de Delphi :
procédure Tapplication.HandleException (Expéditeur : TObject);
commencer
si GetCapture <> 0 alors SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
si ExceptObject est une exception alors
commencer
sinon (sauf que l'objet est EAbort), alors
si assigné (FOnException) alors
FOnException (Expéditeur, Exception (ExceptObject))
autre
ShowException(Exception(ExceptObject));
fin sinon
SysUtils.ShowException (ExceptObject, ExceptAddr);
fin;
5. La différence entre Abort , Break et Exit
Abort, Break et Exit sont quelque peu similaires, mais très différents. Break est utilisé pour sortir d'une boucle dans une instruction de boucle. La sortie est utilisée pour sortir du corps de fonction (ou du corps de processus) en cours d'exécution. Abandonner vous permet de sortir d'une ou plusieurs couches de code jusqu'à ce que le code de capture d'exception l'attrape.
6. Personnalisez les exceptions silencieuses
Tout comme pour déclarer une sous-classe d'une classe d'exception normale, créez simplement EAbort et ses sous-classes comme classes ancêtres :
TMyException = Classe (EAbort);
TNextException = Classe (EAbort);
etc.
Musicwind®@HangZhou.Zhejiang.Chine
20/10/2001
Plus d'articles
[ Fin de l'article]