next up previous contents
Next: Propagation d'exceptions Up: Traitement d'exceptions Previous: Traitement d'exceptions

Sémantique d'un traitement d'exceptions

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;



Maria-Viginia Aponte
2001-11-21