Instructions de gestion des exceptions
Remonter à Ecriture de gestionnaires d'exceptions
Le bloc de gestion d'exception commence par le mot clé except et se termine par le mot clé end. Ces deux mots clés font partie de la même instruction que le bloc try. En d'autres termes, dans Delphi, le bloc try et le bloc de gestion d'exception sont considérés comme faisant partie d'une même instruction try...except.
Dans le bloc de gestion d'exception, vous placez un ou plusieurs gestionnaires d'exceptions. Un gestionnaire d'exception est une instruction de la forme suivante :
on <type of exception> do <statement>;
Par exemple, le bloc de gestion d'exception suivant comprend plusieurs gestionnaires pour différentes exceptions susceptibles d'être déclenchées à partir d'un calcul arithmétique :
try
{ instructions de calcul }
except
on EZeroDivide do Value := MAXINT;
on EIntOverflow do Value := 0;
on EIntUnderflow do Value := 0;
end;
La plupart du temps, comme dans l'exemple précédent, un gestionnaire d'exception n'ayant pas besoin d'informations sur l'exception autre que son type, les instructions qui suivent on..do sont seulement spécifiques au type de l'exception. Néanmoins, dans certains cas vous avez besoin des informations contenues dans l'instance d'exception.
Pour lire dans un gestionnaire d'exception les informations spécifiques à une instance d'exception, vous devez utiliser une variante particulière de la construction on..do qui vous donne accès à l'instance d'exception. Cette forme spéciale nécessite la spécification d'une variable temporaire utilisée pour stocker l'instance. Par exemple :
on E: EIntegerRange do
ShowMessage(Format('Valeur attendue entre %d et %d', E.Min, E.Max));
La variable temporaire (ici E) est du type spécifié après le caractère deux points (EIntegerRange dans cet exemple). Vous pouvez, si nécessaire, utiliser l'opérateur as pour transtyper l'exception dans un type plus spécifique.
Avertissement : Ne détruisez jamais l'objet exception temporaire. La gestion de l'exception détruit automatiquement l'objet exception. Si vous détruisez l'objet vous-même, l'application tente à nouveau de détruire l'objet, ce qui génère une violation d'accès.
Vous pouvez définir un seul gestionnaire d'exception par défaut qui gère toutes les exceptions n'ayant pas de gestionnaire spécifiquement défini. Pour ce faire, ajoutez une partie else au bloc de gestion d'exception :
try
{ instructions }
except
on ESomething do
{ code de gestion d'exception spécifique };
else
{ code de gestion d'exception par défaut };
end;
L'ajout d'une gestion par défaut des exceptions dans un bloc garantit que ce bloc gère, d'une manière ou d'une autre, toutes les exceptions. Cela redéfinit donc toute gestion effectuée par n'importe quel bloc conteneur.
Avertissement : Il n'est pas conseillé d'utiliser le gestionnaire d'exception par défaut qui couvre un domaine trop vaste. La clause else gère toutes les exceptions, y compris celles dont vous ne connaissez rien. En général, votre code ne doit gérer que les exceptions que vous savez comment gérer. Si vous voulez à la fois "faire le ménage" et réserver la gestion des exceptions à du code disposant de davantage d'informations sur l'exception et la manière de la gérer, vous pouvez utiliser un bloc finally. Pour plus d'informations sur les blocs finally, voir Ecriture de blocs finally.