Vous êtes sur la page 1sur 15

La gestion des exceptions et le contrle d'erreurs sous Delphi

par Tony Baheux

Date de publication : Dernire mise jour :

Tout d'abord qu'est qu'une exception ? Comme son nom l'indique une exception est un vnement imprvu par le programmeur (ou programme). Vous me direz comment peut-il grer quelque chose qu'il n'a pas prvu ? Trs simple, le programmeur sachant que le monde n'est pas parfait aura pris le soin de protger des blocs d'instructions sensibles.

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

1 - Introduction 2 - Try..Finally 3 - Try..Except 3-1 - Grammaire 3-2 - Listes non exhaustive de classe d'exception 4 - Exception personnalise 5 - Raise 6 - Conclusion

-2Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

1 - Introduction
Le prsent tutoriel n'a pas la prtention de tout vous apprendre sur la gestion des exceptions (comme tous les tutoriels que je fais mais celui-l plus que les autres). Mon but est de vous aider ne plus rechigner les utiliser, en vous donnant tout ce que vous avez besoin de savoir pour vous sentir l'aise avec la bte. Pour ceux qui ont dj pris l'habitude d'utiliser leurs services, je leur conseille de le parcourir quand mme, il se pourrait qu'ils apprennent quelque chose. Si tel n'tait pas le cas, toutes mes excuses (et mieux encore vous en connaissez plus sur le sujet, je vous invite complter/modifier ce tutoriel). Tout d'abord qu'est qu'une exception ? Comme son nom l'indique une exception est un vnement imprvu par le programmeur (ou programme). Vous me direz comment peut-il grer quelque chose qu'il n'a pas prvu ? Trs simple, le programmeur sachant que le monde n'est pas parfait aura pris le soin de protger des blocs d'instructions sensibles. Concrtement, lorsque vous dveloppez votre application, vous vous attendez ce que telle ou telle chose soit disponible (un fichier dll par exemple) ou que l'utilisateur saisisse tel type de donne dans telle variable (un champ de saisie o il faut entrer des nombres). Par utilisateur, je considre aussi bien une personne que le programme lui-mme. Or il arrive que les choses ne se passent pas tout fait comme vous les avez souhaites, fichier absent, caractre vers une variable numrique, etc. Pour protger votre application et plus prcisment un bloc de code, une solution est d'utiliser les exceptions et ainsi viter votre application de planter lamentablement. Une autre solution serait de faire des tests mais si pour des cas simples, les tests sont faciles mettre en place (l'exemple de la division par zro est assez parlant), il n'en est pas de mme pour des tches plus complexes ou sujettes diffrents types d'erreur (comme l'accs un fichier). D'autres diront que grer par exception les cas problme, allge le code ( vous de voir). D'autre diront que c'est mieux de faire ainsi parce que c'est plus classe (l aussi vous de voir) Et justement, ce cours a pour but de vous permettre de vous faire une opinion :) Les exceptions peuvent tre de natures diffrentes suivant l'opration o elles se produisent. Ces diffrentes exceptions sont appeles type d'exception ou classe d'exception. Par exemple lors d'une tentative de conversion d'un string en float, si le string contient des lettres, on aura une exception de type classe de conversion (EConverError). La protection d'un bloc de code se fait par l'utilisation d'un couple de mot cl. Ces couples sont : try..finally et try..except. Les deux couples protgent le code situ entre try et l'autre mot cl, si une exception arrive entre ces deux mots cls, le programme arrte de traiter le bloc protg et passe tout de suite aux instructions qui suivent le second mot cl du couple. Un peu comme un if/else, sauf qu'au lieu du test, on surveille les erreurs ventuelles entre le if et le else. La diffrence entre le couple try..finally et try..except se situe dans la condition d'excution du second bloc d'instruction et dans la suite de l'excution du programme. Les deux couples de mots cls sont utiliss de manire tout fait diffrente car ils ont une condition d'excution diffrente et un comportement diffrent. Le couple try..finally est utilis pour s'assurer qu'une opration sera toujours ralise. En effet, peu importe qu'il est eu une erreur, les instructions entre le finally et son end; seront excutes. D'ailleurs, l'erreur n'est pas du tout trait par un couple try..finally. L'unique but de ce couple est de garantir que le code entre finally et son end sera excut. Quant l'erreur, si elle ne trouve pas un couple try..except, elle est remonte la fonction appelante jusqu' ce qu'elle soit traite. Dans le pire des cas, l'erreur est affich exactement comme lorsque le programme n'est pas protg. Avec try..except, les instructions du second bloc d'instruction ne sont excutes que s'il y a eut une erreur

-3Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

entre le try et le except. Le but de ce couple sert effectivement grer les erreurs. try..except propose un mcanisme pour traiter, l'exception en fonction de la classe d'exception. Autrement dit, de traiter l'erreur en fonction de sa nature. Pour vous faire une ide plus concrte de la chose, voici la syntaxe pour try..finally et try..except. Try..Finally
instructions1 try // Bloc de code protger instructions protges finally // Second bloc de code // Ce bloc sera excut la fin des instructions protges // ou ds qu'une erreur survient dans le bloc de code protg instructions2 end; // suite des instructions qui seront excutes s'il n'y a pas eu d'erreur plus haut. instructions3

Try..Except
instructions1 try // Bloc de code protger instructions protges except // Second bloc de code // Ce bloc ne sera excut que si une erreur survient dans la partie protge instructions2 end; // suite des instructions qui seront excutes, mme en cas d'erreur plus haut car dj traite. instructions3

Vous l'aurez remarqu, le bloc dit protg est celui qui le parat le moins. En fait on devrait dire bloc protger, c'est dire qu'il s'agit d'une suite d'instruction pouvant causer des exceptions. Votre programme ne va plus planter lamentablement lorsqu'il rencontrera une erreur dans un bloc protg. Par contre vous continuerez d'avoir les messages d'erreur en l'excutant depuis Delphi, cela est destin vous aider vrifier que vous interceptez bien la bonne classe d'exception. Nous verrons cela plus en dtail pour la partie try..except.

-4Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

2 - Try..Finally
La syntaxe de try..finally est :
try instruction1 finally instruction2 end;

Instruction1 est une partie sensible du code (manipulation d'un fichier, cration d'un objet, etc...) et instruction2 une partie du code qui doit tre excut quoiqu'il arrive (libration de ressource, fermeture d'une connexion etc...). Si une erreur survient dans les instructions du bloc instruction1, l'excution passe immdiatement l'excution d'instruction2 sinon l'excution termine les instructions et passe ensuite au instruction2. Le programme poursuit ensuite normalement son excution s'il n'y a pas eu d'erreur sinon l'erreur est remonte au prochain except. S'il n'y a aucun couple try..except pour grer l'erreur, le programme se conduit comme d'habitude en cas d'erreur et vous gratifie d'un message sibyllin. (Rassurez-vous, vous aurez toutes les pices en main avec la partie try..except.)

Vous l'aurez compris, son utilisation est fortement recommande pour librer une ressource mme si le programme rencontre une erreur. Mais attention, l'instruction demandant la ressource doit se trouver l'extrieur du try..finally. Dans le cas contraire, s'il arrivait que le programme ne puisse pas allouer la ressource, tenter de la librer peut provoquer une erreur. Exemple : Cration d'un objet
procedure TForm1.Button1Click(Sender: TObject); var Ob : TObjetExemple; begin Ob := TObjetExemple.Create; // Cration de l#objet, en dehors du try..finally try // Manipulation de l'objet {instructions} finally Ob.Free; // Libration de l'objet end; end;

Exemple : assignation d'un fichier


function OuvrirF(Nom : TFileName) : boolean; var F : Textfile; S : string; i, j, valeur :integer; begin AssignFile(F,Nom); // Ouverture du fichier, en dehors du try..finally try // Manipulation du fichier Reset(F); readln(F,S); {instructions} Result := True; finally CloseFile(F); // Libration du fichier end; end;

-5Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

Notez la position de demande d'allocation de ressource par rapport au try..finally.

Attention : Tant que vous n'avez pas appel CloseFile(F), vous ne pouvez plus manipuler le fichier (renommer, dtruire, dplacer etc...). Ne l'oubliez pas ! Ceci est valable pour les fichiers mais aussi pour d'autres ressources (base de donnes, priphrique...). D'o l'importance de s'assurer de leur libration :)

-6Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

3 - Try..Except 3-1 - Grammaire


Commenons par un simple et classique : Examinons une application fournissant un champ de saisie n'attendant que des nombres comme saisie. Deux solutions s'offrent vous, la premire empcher l'utilisateur d'entrer autre chose que des caractres numriques et la seconde utiliser les exceptions. Laissons la premire de ct et intressons-nous la seconde. Ce que nous devons protger est le moment o la saisie de l'utilisateur doit tre affecte une variable de type numrique. Vous pouvez tester en ralisant une application faisant une telle opration. Lors de l'excution, un message d'erreur se produira ds que vous affecterez des lettres la variable, plantant le plus souvent votre application. Par contre en protgeant votre bloc de code, non seulement, vous limitez l'erreur cette portion de code et vous pouvez en plus raliser un traitement spcifique au problme (rinitialiser des variables, informer l'utilisateur...). La syntaxe est la suivante :
try instruction1 except instruction2 end; instruction3

Instruction1 est comme pour le try..finally la partie sensible du code tandis qu'instruction2 le code qui sera excut si instruction1 provoque une erreur. Si une erreur survient dans les instructions du bloc instruction1, l'excution passe immdiatement l'excution d'instruction2 sinon l'excution termine les instructions et passe ensuite aux instruction3. Contrairement au try..finally, la suite de l'excution se passe normalement, l'erreur ayant t traite. Exemple : Gestion des erreurs lies une conversion de Type.
procedure TForm1.Button1Click(Sender: TObject); var param1 : Double; begin try param1 := StrToFloat(Edit1.Text); {suite des instructions} except on EconvertError do MessageDlg('Erreur : Vous devez entrer un rel' +#10#13+'Le sparateur dcimal est : '+DecimalSeparator, mtError, [mbOk], 0); end; {Autre instruction non sensible} end;

Essayez cet exemple, en cas d'erreur de saisie vous aurez droit un message d'erreur un peu plus clair que ceux distills par Windows. Pour le vrifier, tapez votre chiffre en vous trompant dans le sparateur dcimal (le point au lieu de la virgule et vice versa), Sans la gestion d'erreur vous saurez seulement que votre saisie n'est pas valide sans comprendre pourquoi car vous avez bien entr un nombre alors que grce la gestion des exceptions, vous aurez le droit :

-7Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

Exemple Try..Except En plus, vous pouvez ajouter des instructions remettant votre programme dans un tat stable (rinitialisation de variable par exemple). L'exemple ci-dessous est une des faons d'crire la gestion des exceptions par try..except. Dans ce cas prcis, nous savions ce qui pouvait provoquer une erreur dans le code protg (une erreur de conversion) et nous n'avons trait que ce cas. D'une manire plus gnrale, on peut considrer que la gestion d'exception peut intercepter des erreurs prvisibles et d'autre plus alatoires (non prvues) et que l'on peut soit traiter les erreurs prvisibles soit les autres ou les deux (ce qui est quand mme prfrable). Quand on veut traiter une erreur prvisible, il faut savoir quelle classe elle appartient, par exemple une erreur de conversion appartient la classe EConvertError (on peut savoir ceci en consultant dans l'aide, c'est le type d'erreur souleve par une fonction particulire). Pour les erreurs imprvues, on peut utiliser un simple else, qui excutera une suite d'instruction par dfaut. Par exemple afficher un message d'erreur pour l'utilisateur avec des causes possibles de la raison. Le try..except pourra se prsenter ainsi :
try {instructions} except {instructions ventuelles communes tous les cas possibles d'erreur} // Gestion des cas prvisibles d'erreur on Exception1 do InstructionTraitantErr1; on Exception2 do InstructionTraitantErr2; .... on Exception(n) do InstructionTraitantErr(n); else InstructionTraitantLesCasNonPrevue; end;

Un exemple complet : Rappel sur l'utilisation du finally. Son utilisation permet de s'assurer qu'une suite d'instruction va tre ralise mme en cas d'erreur dans le code situ avant. Mais l'erreur doit tre traite par un couple try..except. Pour vous aidez bien comprendre, je vous propose l'exemple concret ci-dessous. C'est un extrait du cours sur TFileStream, mais pour viter d'aller voir, ce qui est un tort :) , voici une petite explication. En gros la fonction ouvre un fichier et place le contenu dans une variable de type record (mrec). Pour que les choses se passe bien, le fichier doit exister, on doit pouvoir l'ouvrir, etc. De plus, lorsque le fichier est ouvert par notre application (les autres aussi), il est indisponible pour d'autres applications. Il nous faut donc nous
-8Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

assurer qu'on le fermera ds qu'il ne sera plus ncessaire. Grce au couple try..except et try..finally, nous faisons tout a. Exemple du traitement de l'erreur et de l'utilisation du finally :
function OuvrirFichier(Nom : TFileName;var mrec : TMonRecord) : boolean; var F : TFileStream; i : integer; begin // Ouvre un fichier et affecte le contenu un record F := nil; try // Ce try est li l'except. Par son intermdiaire, on va traiter les erreurs // Ouverture d'un flux sur le fichier en lecture. // Le fichier reste accessible en lecture seule pour d'autres appli. F := TFileStream.Create(Nom, fmOpenRead or fmShareDenyWrite); try // ce try ci est li au finally. Ici on veut s'assurer que le fichier soit libr quoiqu'il advienne. // Vous remarquez que la demande de cration est extrieur au try..finally, n'est ce pas ? // En effet, il n'y a rien librer si cela n'a pas t cr. Le try..except grera ce cas l. // En plus, try..except gra une erreur ventuel survenue entre try..finally. // Je vous laisse le code de lecture notamment pour que vous ralisez que ce code pourrait planter. // Si vous regardez bien, vous verrez plusieurs raisons possibles : // Le nombre de champ peut ne pas tre celui attendu, // Des erreurs de conversions peuvent survenir, etc. F.Position := 0; // Dbut du flux if (pos('.zio',ExtractFileName(Nom))>0) then // Vrification du type du Fichier begin // Lecture du fichier while (F.position < F.Size) do // Tant que la fin du fichier n'est pas atteinte faire : begin with mrec do // voir TMonRecord pour savoir quelle type de donne nous avons. begin // Lit la valeur et dplace la position en cours // La premire valeur lue est un entier (le fichier a t enregistr ainsi) F.ReadBuffer(entier, SizeOf(integer)); // Ensuite nous avons un rel F.ReadBuffer(reel, SizeOf(Double)); // De nouveau un entier mais sa valeur n'est pas directement exploitable dans mrec. // On le convertit, ici il s'agit d'un type numr. F.ReadBuffer(i, SizeOf(integer)); enum := TEnumTest(i); // On lit ensuite une Chaine de caractre dont la taille est limite (string[taille]). F.ReadBuffer(chainelimit, SizeOf(Chainelimit)); // On lit un entier correspondant la taille de la chaine qui suit F.ReadBuffer(i, SizeOf(i)); // Allocation d'assez d'espace dans la chaine pour la lecture SetLength(chaine, i); // Lecture de la chaine, on transmet un pointeur sur la chaine soit Chaine[1]. F.ReadBuffer(chaine[1], i); end; end; Result := true; end else begin MessageDlg('Erreur ce n''est pas un fichier test.', mtError, [mbOk], 0); Result := false; end; finally // Ici, on libre le fichier. Comme la libration est dans la partie finally, // on est sr que le fichier sera bien librer. F.Free; end; // fin try..finally except // L, on traite les erreurs. Result := False; on EInOutError do begin MessageDlg('Erreur d''E-S fichier.', mtError, [mbOk], 0); end;

-9Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

Exemple du traitement de l'erreur et de l'utilisation du finally :


on EReadError do begin MessageDlg('Erreur de lecture sur le fichier.', mtError, [mbOk], 0); end; else begin // Ici, on traite les erreurs auquel on n'a pas pens ou dont on ne veut pas s'encombrer // par exemple, les erreurs de conversions. MessageDlg('Erreur sur le fichier.', mtError, [mbOk], 0); end; end; // fin try..except // Les erreurs ont t trait, le programme continuera donc normalement. D'autant plus, que nous renvoyons // le rsultat de l'opration (result) end;

Prcision : La protection d'un bloc de code par try..except permet d'viter la propagation du message d'erreur mais dans certain cas, il peut tre ncessaire de relancer sa diffusion. La commande raise peut tre utilise cet effet voir son chapitre pour plus de prcision.

3-2 - Listes non exhaustive de classe d'exception


Ceci est une liste incomplte des classes d'exception que vous pouvez tre amen utiliser.

EconvertError : Erreur de conversion, vous essayez de convertir un type en un autre alors qu'ils sont incompatibles. Exemple : un string en integer (StrToInt) avec un string ne correspondant pas un nombre entier. EDivByZero : Le programme a tent de faire une division par zro (pas Cool). EFOpenError : Le programme ne peut ouvrir un fichier spcifi (le fichier n'existe pas par exemple) EInOutError : Erreur d'entre-sortie, sur le fichier spcifi EReadError : Le programme tente de lire des donnes dans un flux mais ne peut lire le nombre spcifi d'octets. ERangeError : Dbordement de taille. Le programme dpasse les bornes d'un type entier ou les limites d'un tableau. EAbort : Exception spciale car elle n'affiche pas de message d'erreur. On peut s'en servir pour annuler une tache en cours si une condition arrive (une erreur par exemple). Pour la dclencher un simple appel Abort; suffit, une exception EAbort est alors gnre. C'est un moyen simple de crer une exception personnalise, il suffit alors de traiter l'exception on EAbort do. Si vous n'arrivez pas trouver la classe d'exception correspondant votre code, tenter de provoquer l'erreur. Dans le message d'erreur, Delphi vous indiquera la classe d'exception (si elle existe), ce message permet aussi de tester si on a intercept la bonne classe d'exception.

- 10 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

4 - Exception personnalise
Toutes les exceptions drivent de la Class exception, vous pouvez donc crer vos propres classes d'exception en hritant de cette classe. Ceci peut vous permettre de grer votre programme par exception en supprimant tous les tests des cas qui ne vous intresse pas (exemple : la vrification qu'un diviseur est non nul). En disant que toutes les exceptions drivent de la classe Exception. Ce qui n'est pas tout fait exact. En fait n'importe quel objet peut tre dclench en tant qu'exception. Cependant, les gestionnaires d'exception standard ne grent que les exceptions drivant de la classe exception. Dans votre programme, si vous voulez dclarer une nouvelle classe d'exception, vous aurez entrer le code suivant :
type MonException = class(Exception) HelpContext : THelpContext; // Contexte dans l'aide Message : string; // Message d'erreur public procedure FonctionGerantErreur(); // Fonction appeler en cas d'erreur end; procedure FonctionGerantErreur(); begin {instructions} end;

Seule la premire ligne est obligatoire. Si vous ne prcisez pas le reste, la seule information disponible lors du dclenchement de votre exception sera son nom. FonctionGerantErreur est le nouveau gestionnaire de l'exception, dans cette fonction vous mettrez le code assurant la stabilit de votre application. Rmq : Pour accder au message ou la Mthode d'une Exception (FonctionGerantErreur) tapez E.Message ou E.MaFonction. Dans ce cas le try..except doit s'crire ainsi :
try {instructions} except on E : Exception do ShowMessage('Message : ' + E.Message); // Et/Ou E.MaFonction; // Permet de Centraliser le code grant un type d'erreur end;

Exemple : Exception personnalise


type EValeurIncorrect = class(Exception);

et dans le code
if Valeur <> ValeurCorrect then raise EValeurIncorrect.Create('Valeur ne fait pas partie des valeurs autorises');

La proprit Message de la classe Exception (y compris les classes drives) et l'affichage de message personnalis dans le bloc except/end sont quivalents. Pour les classes d'exception dj existantes, on prfrera sans doute rendre le message plus explicite tandis que pour les classes personnalises on aura recours la proprit Message plutt que d'indiquer chaque fois le texte.

- 11 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

Il en est de mme pour les instructions grant l'erreur. On n'utilisera la Mthode de la classe que pour ceux personnalises, vitant d'utiliser une fonction orpheline ou pire de rcrire chaque fois le code. Reportez-vous sur les classes pour plus de renseignement sur l'hritage.

- 12 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

5 - Raise
Protger ainsi votre code, vous permet d'intercepter les messages d'erreur. Toutefois dans certaine situation, vous souhaiterez que le message d'erreur soit propag pour qu'il soit intercept par une autre gestion des exceptions. Prenons l'exemple de l'assignation de fichier, plutt que d'utiliser une variable de retour pour indiquer le rsultat de l'opration, on pourrait transmettre le message d'erreur ventuel. A cet effet, la commande raise est votre disposition. Raise ne sert pas uniquement propager un message d'erreur, on peut aussi s'en servir pour dclencher une exception (en gnrale pour dclencher une exception personnalise comme vous avez pu le voir plus haut). Exemple de dclenchement d'exception personnalise.
if Valeur <> ValeurCorrect then raise EValeurIncorrect.Create('Valeur ne fait pas partie des valeurs autorises');

Exemple complet de l'utilisation de raise :


unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Dclarations prives } public { Dclarations publiques } end; MonException = class(Exception) public function GestErr():string; end; var Form1: TForm1; implementation {$R *.DFM} function MonException.GestErr():string; begin if MessageDlg('La variable transmise est incorrect continuer avec la valeur par dfaut', mtInformation, [mbYes, mbNo], 0) = mrYes then begin Result := 'trs petit'; end; end; function DoQuelqueChose(valeur : double):string; begin // La fonction ne travaille que sur des nombres rels positifs if valeur < 0 then begin raise MonException.Create('Erreur: Travaille impossible !'); end; // Travaille sur valeur compltement sans intrt if valeur < 10 then result := 'trs petit'

- 13 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

Exemple complet de l'utilisation de raise :


else if valeur <= 50 then result := 'moiti de cent' else if valeur <= 100 then result := 'gal cent' else result := 'trs grand'; end; procedure TForm1.Button1Click(Sender: TObject); var r : double; tmpstr : string; begin try r := StrToFloat(Edit1.Text); tmpstr := DoQuelqueChose(r); except on E : MonException do tmpstr := E.GestErr; on EconvertError do begin ShowMessage('Erreur de Saisie : nombre attendu' +#10#13+'Sparteur dcimal : '+DecimalSeparator); tmpstr := 'Mauvaise saisie'; end; // Attention n'oubliez pas ce point virgule (on est pas dans le cas if/else !) else begin ShowMessage('Erreur Inconnue'); tmpstr := 'Invalid'; end; end; ShowMessage('Rsultat : '+tmpStr); end; end.

- 14 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com

La gestion des exceptions et le contrle d'erreurs sous Delphi par Tony Baheux

6 - Conclusion
Grce aux exceptions apparues avec la programmation objet, le dveloppeur a maintenant sa disposition un outil efficace pour protger son programme des alas de l'informatique. J'espre que le prsent tutoriel a t pour vous une mine d'information et que dsormais vous aborderez la gestion des exceptions avec srnit.

Sommaire

- 15 Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de ces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005 - Flash (Tony Baheux). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://flash-koti.developpez.com