Les blocs finally                        

Les blocs finally

           

L'exemple ci-dessous a pour objectif de montrer l'effet d'un bloc finally. Ce que fait l'exemple ne présente pas d'intérêt en soi.

On appelle bloc finally la clause finally suivi d'un bloc d'instructions.
Un bloc finally est en général utilisé pour effectuer des nettoyages (fermer des fichiers, libérer des ressources...).
On doit toujours utiliser un bloc finally en association avec un bloc try.
Un bloc finally suit:

Dans les deux cas, quelque soit la façon dont on est sorti du bloc try (par une instruction break, ou continue, ou return, par une propagation d'exceptions, ou bien normalement), les instructions contenues dans le bloc finally sont exécutées. Si un bloc catch situé entre le bloc try et le bloc finally attrape une exception, les intructions du bloc catch sont exécutées avant celles du bloc finally.

Vous pouvez essayer de deviner la sortie du programme avant de regarder ce qu'il en est et éventuellement de lire les explications.
Vous remarquerez aussi que la mention throws MonException figure dans les en-têtes de toutes méthodes susceptibles de lancer cette exception.

class MonException extends Exception {
  MonException() {
    System.out.println("me voila");
  }   
}

class Propagation {
   static boolean probleme = true;

   static void methodeBasse() throws MonException {
      try {
	  if (probleme) throw new MonException();
	  System.out.println("et moi ?");
      }
      finally {
	  System.out.println("hauteur basse : il faudrait etre ici");
      }
      System.out.println("pas mieux");
   }

   static void methodeMoyenne() throws MonException {
      try {
	  methodeBasse();
	  System.out.println("et ici ?");
      }
      finally {
	  System.out.println("moyenne hauteur : ou bien etre la");
      }
   }

   static void methodeHaute() {
      try {
	  methodeMoyenne();
      }
      catch(MonException e) {
	  System.out.println("attrape...");
      }
  }

   static public void main(String[] arg) {
       methodeHaute();
   }
} 
On obtient en sortie
me voila
hauteur basse : il faudrait etre ici
moyenne hauteur : ou bien etre la
attrape...

Pour accéder au fichier Propagation.java.


System.out.println("et moi ?"); : si probleme vaut true, cette instruction n'est pas effectuée.
System.out.println("hauteur basse : il faudrait etre ici"); : quelque soit la façon de sortir du bloc try, cette instruction est effectuée.
System.out.println("pas mieux"); : si une instance de monException a été lancée dans le bloc try, comme cette exception n'est pas attrapée, elle se propage en n'effectuant aucune instruction (sauf celles contenues dans un bloc finally). Cette instruction n'est donc pas effectuée.
methodeBasse(); : lorsque dans methodeBasse une exception est lancée et non attrapée, celle-ci se propage à partir de l'endroit où methodeBasse a été invoquée : on dit là aussi que methodeBasse lance l'exception.
System.out.println("et ici ?"); : si methodeBasse a lancé une exception, cette instruction n'est pas effectuée.
System.out.println("moyenne hauteur : ou bien etre la"); : quelque soit la façon de sortir du bloc try, cette instruction est effectuée.
methodeMoyenne(); : si methodeMoyenne a lancé une exception qu'elle n'a pas attrapée, cette exception se retrouve ici.
catch(MonException e) : si une exception de type monException est lancée dans le bloc try par methodeMoyenne, elle est attrapée ici, et l'instruction contenue dans le bloc catch va s'effectuer. Le programme reprendra alors son déroulement normal.

© Irène Charon Télécom ParisTech 2010