JavaSE 7 - multi-catch


Jusqu'à maintenant, dans la structure try-catch, chaque catch ne pouvait traiter qu'un seul type d'exception. Donc c'est un traitement spécifique pour chaque type d'exception attrapée.

       try {
           Class.forName("org.sewatech.examples.java7.MyClass").newInstance();
           //...
       } catch (ClassNotFoundException e) {
           System.err.printf("Problème de création de mon objet (%s)\n", e);
       } catch (InstantiationException e) {
           System.err.printf("Problème de création de mon objet (%s)\n", e);
       } catch (IllegalAccessException e) {
           System.err.printf("Problème de création de mon objet (%s)\n", e);
       }

On peut certes jouer avec l'héritage entre classes d'exception, mais on arrive rapidement à quelque chose comme catch(Exception ex). Sans grand intérêt.

       try {
           Class.forName("org.sewatech.examples.java7.MyClass").newInstance();
           //...
       } catch (Exception e) {
           System.err.printf("Problème de création de mon objet (%s)\n", e);
       }

Pour éviter ce tout-ou-rien, Java SE 7 permet maintenant de traiter plusieurs types d'exceptions, séparés par un 'pipe', pour chaque catch.

       try {
           Class.forName("org.sewatech.examples.java7.MyClass").newInstance();
           //...
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
           System.err.printf("Problème de création de mon objet (%s)\n", e);
       }

Au passage, le rethrow est mieux géré, avec une meilleure inférence.

Très pratique, cette nouveauté ne devrait pas être tant utilisée que cela ; la faute aux frameworks comme hibernale, Ajp, Spring, CDI,... qui nous aident à mieux gérer les exceptions et, surtout, à en séparer le traitement du code métier.