Vous êtes sur la page 1sur 4

DELPHI: Gestion des Exceptions Delphi

http://delphi-pascal.blogspot.com/2011/09/exceptions-delphi.html

DELPHI
Delphi sur le bout des doigts

Gestion des Exceptions Delphi


A propos des exceptions Une exception est dclenche quand une erreur ou un autre vnement interrompt le droulement normal d'un programme. L'exception transfre le contrle un gestionnaire d'exception, ce qui vous permet de sparer la logique normale d'excution du programme de la gestion des erreurs. Comme les exceptions sont des objets, elles peuvent tre regroupes en hirarchies en utilisant l'hritage et de nouvelles exceptions peuvent tre ajoutes sans affecter le code existant. Une exception peut vhiculer des informations, par exemple un message d'erreur, depuis le point o elle est dclenche jusqu'au point o elle est gre. Quand une application utilise l'unit SysUtils, la majorit des erreurs d'excution sont automatiquement converties en exceptions. Nombre d'erreurs qui, autrement, provoqueraient l'arrt d'une application (mmoire insuffisante, division par zro, erreurs de protection gnrales) peuvent ainsi tre interceptes et gres. Quand utiliser des exceptions Les exceptions offrent un moyen lgant d'intercepter les erreurs d'excution sans arrter le programme et sans utiliser d'encombrantes instructions conditionnelles. Les exigences imposes par la smantique de la gestion des exceptions se traduisent par une pnalisation au niveau de la taille du code ou des donnes et au niveau des performances l'excution. Il est possible de dclencher des exceptions pour presque toutes les raisons et de protger pratiquement n'importe quel bloc de code en l'intgrant dans une instruction try...except ou try...finally, mais, en pratique, il vaut mieux rserver ces outils des situations particulires. La gestion des exceptions convient aux erreurs qui ont peu de chances de se produire, mais dont les consquences sont quasiment catastrophiques (le crash d'une application, par exemple) ; aux conditions d'erreurs difficiles tester dans des instructions if...then ; et quand vous avez besoin de rpondre aux exceptions dclenches par le systme d'exploitation ou par des routines dont le code source n'est pas sous votre contrle. Les exceptions sont couramment utilises pour les erreurs matrielles, de mmoire, d'entre/sortie et du systme d'exploitation. Les instructions conditionnelles sont souvent le meilleur moyen de tester les erreurs. Par exemple, supposons que vous vouliez vous assurer de l'existence d'un fichier avant d'essayer de l'ouvrir. Vous pourriez le faire comme ceci :
try AssignFile(F, FileName); Reset(F); // dclenche une exception EInOutError si le fichier est introuvable except on Exception do ... end;

DELPHI...
Delphi : de Borland a Embarcadero Langage Pascal RAD Studio XE2 2012 Nouveauts IDE depuis Delphi 7 Nouveauts Langage depuis Delphi 7 Nouveauts Delphi XE2 2012 Delphi XE2 64 bits FireMonkey dans Delphi XE2 Multiplates-formes Delphi XE2 2012 Programmation Delphi : le meilleur est arriv Refactoring Delphi Types de Donnes Delphi Gnriques de Delphi Embarcadero Delphi (English) Nouveauts Delphi XE 2011 Classes et objets Delphi Gestion des Exceptions Delphi Procdures et Fonctions Delphi Les Proprits (Classes Pascal Delphi) Les Champs (Classes Pascal Delphi) Les Mthodes (Classes Pascal Delphi) Prsentation EDI Delphi Unicode dans Delphi Nouveauts Delphi 2010 - partie 2 Nouveauts Delphi 2010 - partie 1 Nouveauts Delphi 2009 - partie 2 Nouveauts Delphi 2009 - partie 1

Outils et Composants indispensables


JEDI Visual Component Library GExperts UIB components to use Interbase and FireBird Virtual Treeview component Andy's Blog and Tools

Mais, vous pourriez aussi viter la lourdeur de gestion d'exception en utilisant :


if FileExists(FileName) then aucune exception begin AssignFile(F, FileName); Reset(F); end; // renvoie False si le fichier est introuvable ; ne dclenche

Liens Delphi
Delphi Embarcadero Delphi sur Developpez Delphi CodeS SourceS About Delphi L'Ordinateur Personnel

Les assertions fournissent un autre moyen de tester une condition boolenne n'importe quel endroit du code. Quand une instruction Assert choue, le programme s'arrte avec une erreur d'excution ou (s'il utilise l'unit SysUtils) dclenche une exception EAssertionFailed. Les assertions devraient n'tre utilises que pour tester les conditions que vous ne souhaitez pas voir se produire. Dclaration des types exception

Ma liste de blogs
The Oracle at Delphi

Les types exception sont dclars comme les autres classes. En fait, il est possible d'utiliser comme exception une instance de toute classe. Il est nanmoins prfrable de driver les exceptions de la classe Exception dfinie dans SysUtils. Vous pouvez grouper les exceptions en familles en utilisant l'hritage. Par

Delphi-Treff interviewIn English

Nick Hodges
Random Thoughts on the Passing Scene #162

1 sur 4

16/01/2012 11:58

DELPHI: Gestion des Exceptions Delphi

http://delphi-pascal.blogspot.com/2011/09/exceptions-delphi.html

exemple, les dclarations suivantes de SysUtils dfinissent une famille de types exception pour les erreurs mathmatiques :
type EMathError = class(Exception); EInvalidOp = class(EMathError); EZeroDivide = class(EMathError); EOverflow = class(EMathError); EUnderflow = class(EMathError);

James Gosling: on the Jav Road Marco's Tech World

Etant donn ces dclarations, vous pouvez dfinir un seul gestionnaire d'exceptions EMathError qui gre galement EInvalidOp, EZeroDivide, EOverflow et EUnderflow. Les classes d'exceptions dfinissent parfois des champs, des mthodes ou des proprits qui contiennent des informations supplmentaires sur l'erreur. Par exemple,
type EInOutError = class(Exception) ErrorCode: Integer; end;

Dclenchement et gestion des exceptions Pour dclencher un objet exception, utilisez une instance de la classe d'exception avec une instruction raise. Par exemple,
raise EMathError.Create;

En gnral, une instruction raise a la forme : Raise objet at adresse O "objet" et "at adresse" sont tous deux facultatifs. Lorsqu'une adresse est spcifie, cela peut tre n'importe quelle expression dont le rsultat est un type pointeur, mais c'est habituellement un pointeur sur une procdure ou une fonction. Par exemple :
raise Exception.Create('Paramtre manquant') at @MyFunction;

Utilisez cette option pour dclencher l'exception depuis un emplacement de la pile antrieur celui o l'erreur s'est effectivement produite. Quand une exception est dclenche (c'est--dire qu'elle est rfrence dans une instruction raise), elle est rgie par la logique particulire de gestion des exceptions. Une instruction raise ne renvoie jamais le contrle d'une manire normale. Elle transfre la place le contrle au gestionnaire d'exception le plus proche capable de grer les exceptions de la classe donne. Le gestionnaire le plus proche correspond au dernier bloc try...except dans lequel le flux d'excution est entr sans en tre encore sorti. Par exemple, la fonction suivante convertit une chane en entier et dclenche une exception ERangeError si la valeur rsultante est hors de l'intervalle spcifi :
function StrToIntRange(const S: string; Min, Max: Longint): Longint; begin Result := StrToInt(S); // StrToInt est dclare dans SysUtils if (Result < Min) or (Result > Max) then raise ERangeError.CreateFmt('%d n''est pas dans l''intervalle spcifi %d..%d', [Result, Min, Max]); end;

Remarquez la mthode CreateFmt appele dans l'instruction raise. Exception et ses descendants ont des constructeurs spciaux qui proposent d'autres moyens de crer des messages d'exception et des identificateurs de contexte. Une exception dclenche est automatiquement dtruite une fois qu'elle a t gre. N'essayez jamais de dtruire manuellement une exception dclenche. Remarque: Le dclenchement d'une exception dans la section initialisation d'une unit peut ne pas donner le rsultat attendu. La gestion normale des exceptions provient de l'unit SysUtils qui doit d'abord tre initialise pour que cette gestion soit utilisable. Si une exception se produit lors de l'initialisation, toutes les units initialises (dont SysUtils) sont finalises et l'exception est redclenche. Alors, l'exception est intercepte et gre, gnralement par l'interruption du programme. De la mme faon, le dclenchement d'une exception dans la section finalisation d'une unit risque de ne pas produire le rsultat escompt si SysUtils a dj t finalis lorsque l'exception a t dclenche. Instructions Try...except Les exceptions sont gres dans des instructions try...except. Par exemple,
try X := Y/Z; except on EZeroDivide do HandleZeroDivide; end;

Cette instruction tente de diviser Y par Z mais appelle la routine HandleZeroDivide si une exception EZeroDivide est dclenche. L'instruction try...except a la syntaxe suivante : try instructions except exceptionBlock end o instructions est une suite d'instructions (dlimite par des points-virgule) et exceptionBlock est soit une autre suite d'instructions, soit une suite de gestionnaires d'exceptions, ventuellement suivie par des instructions else Un gestionnaire d'exception a la forme : On identificateur: type do instruction o identificateur: est facultatif (si identificateur est prcis, ce doit tre un identificateur valide), type est le type

2 sur 4

16/01/2012 11:58

DELPHI: Gestion des Exceptions Delphi

http://delphi-pascal.blogspot.com/2011/09/exceptions-delphi.html

utilis pour reprsenter les exceptions et instruction est une instruction quelconque. Une instruction try...except excute les instructions dans la liste initiale instructions. Si aucune exception n'est dclenche, le bloc exception (exceptionBlock) n'est pas pris en compte et le contrle passe l'instruction suivante du programme. Si une exception est dclenche lors de l'excution de la liste instructions initiale, que ce soit par une instruction raise dans la liste instructions ou par une procdure ou une fonction appele dans la liste instructions, il va y avoir une tentative de "gestion" de l'exception : Si un des gestionnaires du bloc exception ne correspond l'exception, le contrle passe au premier d'entre eux. Un gestionnaire d'exceptions "correspond" une exception si le type du gestionnaire est la classe de l'exception ou un anctre de cette classe. Si aucun gestionnaire correspondant n'est trouv, le contrle passe l'instruction de la clause else si elle est dfinie. Si le bloc d'exception est simplement une suite d'instructions sans gestionnaire d'exception, le contrle passe la premire instruction de la liste. Si aucune de ces conditions n'est respecte, la recherche continue dans le bloc exception de l'avant-dernire instruction try...except dans laquelle le flux du programme est entr et n'est pas encore sorti. S'il n'y a l aucun gestionnaire appropri, aucune clause else, ni aucune liste d'instructions, la recherche se propage l'instruction try...except prcdente, et ainsi de suite. Si l'instruction try...except la plus externe est atteinte et que l'exception n'est toujours pas gre, le programme s'interrompt. Quand l'exception est gre, le pointeur de la pile est ramen en arrire jusqu' la procdure ou la fonction contenant l'instruction try...except o la gestion a lieu et le contrle d'excution passe au gestionnaire d'exception excut, la clause else ou la liste d'instructions. Ce processus efface tous les appels de procdure ou de fonction effectus partir de l'entre dans l'instruction try...except o l'exception est gre. L'objet exception est alors automatiquement dtruit par un appel de son destructeur Destroy et le contrle revient l'instruction suivant l'instruction try...except. Si un appel d'une procdure standard Exit, Break ou Continue force la sortie du gestionnaire d'exception, l'objet exception est quand mme dtruit automatiquement. Dans l'exemple suivant, le premier gestionnaire d'exception gre les exceptions division-par-zro, le second gre les exceptions de dbordement et le dernier gre toutes les autres exceptions mathmatiques. EMathError apparat en dernier dans le bloc exception car c'est l'anctre des deux autres classes d'exception ; s'il apparat en premier, les deux autres gestionnaires ne sont jamais utiliss.
try ... except on EZeroDivide do HandleZeroDivide; on EOverflow do HandleOverflow; on EMathError do HandleMathError; end;

Un gestionnaire d'exception peut spcifier un identificateur avant le nom de la classe exception. Cela dclare l'identificateur reprsentant l'objet exception pendant l'excution de l'instruction suivant on...do. La porte de l'identificateur est limite celle de l'instruction. Par exemple,
try ... except on E: Exception do ErrorDialog(E.Message, E.HelpContext); end;

Si le bloc exception spcifie une clause else, la clause else gre toutes les exceptions qui ne sont pas gres par les gestionnaires du bloc. Par exemple,
try ... except on EZeroDivide do HandleZeroDivide; on EOverflow do HandleOverflow; on EMathError do HandleMathError; else HandleAllOthers; end;

Ici, la clause else gre toutes les exceptions qui ne sont pas des erreurs mathmatiques (EMathError). Si le bloc exception ne contient pas de gestionnaires d'exceptions mais une liste d'instructions, cette liste gre toutes les exceptions. Par exemple,
try ... except HandleException; end;

Ici la routine HandleException gre toutes les exceptions se produisant lors de l'excution des instructions comprises entre try et except. Redclenchement d'exceptions Quand le mot rserv raise apparat dans un bloc exception sans tre suivi d'une rfrence d'objet, il dclenche l'exception qui tait gre par le bloc. Cela permet un gestionnaire d'exception de rpondre une erreur d'une manire partielle, puis de redclencher l'exception. Cela est pratique quand une procdure ou une fonction doit "faire le mnage" aprs le dclenchement d'une exception sans pouvoir grer compltement l'exception. Par exemple, la fonction GetFileList alloue un objet TStringList et le remplit avec les noms de fichiers correspondant au chemin de recherche spcifi :
function GetFileList(const Path: string): TStringList; var I: Integer; SearchRec: TSearchRec; begin Result := TStringList.Create; try I := FindFirst(Path, 0, SearchRec); while I = 0 do begin Result.Add(SearchRec.Name); I := FindNext(SearchRec); end; except

3 sur 4

16/01/2012 11:58

DELPHI: Gestion des Exceptions Delphi

http://delphi-pascal.blogspot.com/2011/09/exceptions-delphi.html

Result.Free; raise; end; end;

GetFileList cre un objet TStringList puis utilise les fonctions FindFirst et FindNext (dfinies dans SysUtils) pour l'initialiser. Si l'initialisation choue (car le chemin d'initialisation est incorrect ou parce qu'il n'y a pas assez de mmoire pour remplir la liste de chanes), c'est GetFileList qui doit librer la nouvelle liste de chanes car l'appelant ne connat mme pas son existence. C'est pour cela que l'initialisation de la liste de chanes se fait dans une instruction try...except. Si une exception a lieu, le bloc exception de l'instruction libre la liste de chanes puis redclenche l'exception. Exceptions imbriques Le code excut dans un gestionnaire d'exception peut lui aussi dclencher et grer des exceptions. Tant que ces exceptions sont galement gres dans le gestionnaire d'exception, elles n'affectent pas l'exception initiale. Par contre, si une exception dclenche dans un gestionnaire d'exception commence se propager au-del du gestionnaire, l'exception d'origine est perdue. Ce phnomne est illustr par la fonction Tan suivante.
type ETrigError = class(EMathError); function Tan(X: Extended): Extended; begin try Result := Sin(X) / Cos(X); except on EMathError do raise ETrigError.Create('Argument incorrect pour Tan'); end; end;

Si une exception EMathError se produit lors de l'excution de Tan, le gestionnaire d'exception dclenche une exception ETrigError. Comme Tan ne dispose pas de gestionnaire pour ETrigError, l'exception se propage au-del du gestionnaire d'exception initial, ce qui provoque la destruction de l'objet exception EMathError. Ainsi, pour l'appelant, tout se passe comme si la fonction Tan avait dclench une exception ETrigError. Instructions try...finally Dans certains cas, il est indispensable que certaines parties d'une opration s'effectuent, que l'opration soit ou non interrompue par une exception. Si, par exemple, une routine prend le contrle d'une ressource, il est souvent important que cette ressource soit libre quelle que soit la manire dont la routine s'achve. Vous pouvez, dans ce genre de situations, utiliser une instruction try...finally. L'exemple suivant illustre comment du code qui ouvre et traite un fichier peut garantir que le fichier est ferm, mme s'il y a une erreur l'excution.
Reset(F); try ... // traiter le fichier F finally CloseFile(F); end;

Une instruction try...finally a la syntaxe suivante : Try listeInstructions1 finally listeInstructions2 end o chaque listeInstructions est une suite d'instructions dlimites par des points-virgule. L'instruction try...finally excute les instructions de listeInstructions1 (la clause try). Si listeInstructions1 se termine sans dclencher d'exception, listeInstructions2 (la clause finally) est excute. Si une exception est dclenche lors de l'excution de listeInstructions1, le contrle est transfr listeInstructions2 ; quand listeInstructions2 a fini de s'excuter, l'exception est redclenche. Si un appel d'une procdure Exit, Break ou Continue force la sortie de listeInstructions1, listeInstructions2 est excute automatiquement. Ainsi, la clause finally est toujours excute quelle que soit la manire dont se termine l'excution de la clause try. Si une exception est dclenche sans tre gre par la clause finally, cette exception se propage hors de l'instruction try...finally et toute exception dj dclenche dans la clause try est perdue. La clause finally doit donc grer toutes les exceptions dclenches localement afin de ne pas perturber la propagation des autres exceptions. Classes et routines standard des exceptions Les units SysUtils et System dclarent plusieurs routines standard de gestion d'exceptions, dont ExceptObject, ExceptAddr et ShowException. SysUtils, System et d'autres units contiennent galement de nombreuses classes d'exceptions qui drivent toutes (sauf OutlineError) de Exception. La classe Exception contient les proprits Message et HelpContext qui peuvent tre utilises pour transmettre une description de l'erreur et un identificateur de contexte pour une aide contextuelle. Elle dfinit galement divers constructeurs qui permettent de spcifier la description et l'identificateur de contexte de diffrentes manires.

0 commentaires:
Enregistrer un commentaire

Message plus rcent

Accueil

Message plus ancien

Inscription : Publier les commentaires (Atom)

4 sur 4

16/01/2012 11:58