Supposons qu'au cours de l'exécution de B2 l'exception
E soit lévée. Le
flot de contrôle est interrompu
et
transféré à la partie traitement
du bloc. Ce traitement, est un branchement, i.e:
une seule des branches parmi (when E_1 => I1),
(when E_2 => I2) ...
(when others => Im) pourra
être choisie puis le traitement
sera terminé. Pour choisir
quelle branche exécuter, on cherche
le premier cas when E => Ik dans le traitement.
S'il existe, les instructions Ik sont exécutées.
Si aucun cas
n'est prevu pour E, le contrôle est transféré
aux instructions Im du cas others.
S'il n'y pas
de cas others, aucune autre instruction n'est exécutée.
La fin du traitement achève l'exécution du bloc. Ainsi,
il pourra rester des instruction non exécutées dans
le bloc (dans notre exemple, B3),
du fait de l'interruption puis du transfer du
contrôle au traitement.
Exemple 2:
procedure division is x,y : integer; Division_par_zero : exception; begin put("Entrez un entier: "); get(x); -- 1 put("Entrez un entier: "); get(y); if y=0 then raise Division_par_zero; else put("Le resultat de la division de "); put(x,2); put(" par "); put(y,2); put(" est "); put(x/y); end if; exception when Data_Error => put_line("Entree invalide. Au revoir"); when Division_par_zero => put_line("Le diviseur doit etre non nul. Au revoir"); end division;