Les instructions d'exceptions en Delphi sont au nombre de quatre et sont un ajout au Pascal d'origine :
- TRY ... EXCEPT ... END
- ON ... DO
- TRY ... FINALLY ... END
- RAISE
TRY ... EXCEPT ... END
L'instruction «TRY» de Delphi permet d'effectuer la gestion d'une erreur aussi simplement qu'en Java par exemple. On encapsule les instructions à risque entre les mots réservés «TRY» et «EXCEPT», puis on met le traitement d'erreur entre les mots réservés «EXCEPT» et «END». Voici donc sa syntaxe :
TRY instructionarisque EXCEPT instruction_exécuté_si_exception END |
ON ... DO
Il est pratique de pouvoir effectuer l'interception d'erreur, toutefois il peut arriver que plusieurs situation d'erreur se produise, de se fait, il est essentiel de pouvoir identifier, de laquelle il s'agit. Delphi, à la manière des vieux interpréteurs Basic comme BASICA et GWBASIC permet d'effectuer une branchement sur les instructions souhaité. Voici enfin sa syntaxe situer dans la zone de traitement d'exception :
TRY instructionarisque EXCEPT ON codeerreur1 DO instructionexception1; ON codeerreur2 DO instructionexception2; ... END |
On peut également rajouter une instruction d'exception exécuté par défaut au cas où aucun des codes d'erreurs n'est rencontré, on utilisera dans ce cas l'instruction «ELSE» :
TRY instructionarisque EXCEPT ON codeerreur1 DO instructionexception1; ON codeerreur2 DO instructionexception2; ... ELSE instructionexceptionpardefaut; END |
TRY ... FINALLY ... END
Le déclenchement d'exception est parfois dangereux lorsqu'on pense au fait qu'on peut gaspiller des ressources mémoire ou oublier d'arrêter un périphérique par exemple. Il existe une instruction permettant de s'assurer que quoi qu'il arrive un bloc d'instruction sera exécuté même si des problèmes auront lieu. Cette instruction c'est «TRY» et «FINALLY». Contrairement aux instructions «TRY EXCEPT» s'exécutant que si une exception à lieu, le zone «FINALLY» est assurément exécuté! Voici donc sa syntaxe :
TRY instructionpeutetreexecuter FINALLY instruction_exécuté_a_la_fin_meme_si_exception END |
RAISE
Naturellement, une exception peut être déclenché par programmation. L'instruction permettant d'effectuer cette opération est «RAISE». Voici enfin les deux syntaxes autorisé :
RAISE instancedexception |
ou
RAISE instancedexception AT expressiondadresse |
Exemple
Cet exemple permet d'indiquer comment intercepter une division par 0 :
- Program TrySamples;
-
- {$APPTYPE CONSOLE}
-
- Uses SysUtils;
-
- Var
- I:Integer;
-
- BEGIN
- For I:=-10 to 3 do Begin
- Try
- WriteLn('I = ',I,', 1/I = ',(1 /I):0:2);
- Except
- On EDivByZero do WriteLn('Division par 0');
- On EZeroDivide do WriteLn('Division par 0');
- On EInvalidOp do WriteLn('Instruction invalide');
- On EMathError do WriteLn('Erreur mathématique');
- On EOverflow do WriteLn('Débordement de valeur');
- On E : Exception do WriteLn('Message d''erreur = ',E.Message);
- End;
- End;
- END.
on obtiendra le résultat suivant :
I = -10, 1/I = -0.10I = -9, 1/I = -0.11
I = -8, 1/I = -0.13
I = -7, 1/I = -0.14
I = -6, 1/I = -0.17
I = -5, 1/I = -0.20
I = -4, 1/I = -0.25
I = -3, 1/I = -0.33
I = -2, 1/I = -0.50
I = -1, 1/I = -1.00
I = 0, 1/I = Division par 0
I = 1, 1/I = 1.00
I = 2, 1/I = 0.50
I = 3, 1/I = 0.33