web-dev-qa-db-fra.com

Est-il possible dans Java d'attraper deux exceptions dans le même bloc catch?

J'ai besoin d'intercepter deux exceptions car elles nécessitent la même logique de traitement. Je voudrais faire quelque chose comme:

catch (Exception e, ExtendsRuntimeException re) {
    // common logic to handle both exceptions
}

Est-il possible d'éviter de dupliquer le code du gestionnaire dans chaque bloc catch?

107
user710818

Java 7 et ultérieur

Les captures d'exceptions multiples sont prises en charge à partir de Java 7.

La syntaxe est la suivante:

try {
     // stuff
} catch (Exception1 | Exception2 ex) {
     // Handle both exceptions
}

Le type statique de ex est le supertype commun le plus spécialisé des exceptions répertoriées. Il existe une fonctionnalité intéressante dans laquelle, si vous rediffusez ex dans la capture, le compilateur sait qu’une seule des exceptions répertoriées peut être levée.


Java 6 et versions antérieures

Avant Java 7, il existe des moyens de gérer ce problème, mais ils ont tendance à être inélégants et à être limités.

Approche n ° 1

try {
     // stuff
} catch (Exception1 ex) {
     handleException(ex);
} catch (Exception2 ex) {
     handleException(ex);
}

public void handleException(SuperException ex) {
     // handle exception here
}

Cela devient compliqué si le gestionnaire d'exceptions doit accéder aux variables locales déclarées avant le try. Et si la méthode du gestionnaire doit réexaminer l'exception (et qu'elle est cochée), vous rencontrez de graves problèmes de signature. Plus précisément, handleException doit être déclaré comme jeté SuperException ... ce qui signifie potentiellement que vous devez modifier la signature de la méthode englobante, etc.

Approche # 2

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     } else {
         throw ex;
     }
}

Encore une fois, nous avons un problème potentiel avec les signatures.

Approche # 3

try {
     // stuff
} catch (SuperException ex) {
     if (ex instanceof Exception1 || ex instanceof Exception2) {
         // handle exception
     }
}

Si vous laissez de côté la partie else (par exemple, car il n'y a pas d'autres sous-types de SuperException à ce moment-ci), le code devient plus fragile. Si la hiérarchie des exceptions est réorganisée, ce gestionnaire sans un else peut finir par manger des exceptions en silence!

194
Stephen C

Java <= 6.x vous permet simplement d’attraper une exception pour chaque bloc catch:

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

Documentation:

Chaque bloc catch est un gestionnaire d'exceptions et gère le type d'exception indiqué par son argument. Le type d'argument, ExceptionType, déclare le type d'exception que le gestionnaire peut gérer et doit être le nom d'une classe qui hérite de la classe Throwable.

Pour Java 7), vous pouvez avoir plusieurs exceptions capturées sur un même bloc catch:

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

Documentation:

Dans Java SE 7 et versions ultérieures, un seul bloc catch peut gérer plusieurs types d'exceptions. Cette fonctionnalité permet de réduire la duplication de code et d'atténuer la tentation d'attraper une exception trop large.

Référence: http://docs.Oracle.com/javase/tutorial/essential/exceptions /catch.html

33
Francisco Spaeth

Si vous n'êtes pas sur Java 7, vous pouvez extraire la gestion de vos exceptions en une méthode - de cette façon, vous pouvez au moins réduire la duplication.

try {
   // try something
}
catch(ExtendsRuntimeException e) { handleError(e); }
catch(Exception e) { handleError(e); }
12
jeff

Avant le lancement de Java SE 7, nous avions l'habitude d'écrire du code avec plusieurs instructions catch associées à un bloc try. Un exemple très basique:

 try {
  // some instructions
} catch(ATypeException e) {
} catch(BTypeException e) {
} catch(CTypeException e) {
}

Mais maintenant, avec la dernière mise à jour sur Java, au lieu d'écrire plusieurs instructions catch, nous pouvons gérer plusieurs exceptions dans une seule clause catch. Voici un exemple montrant comment cette fonctionnalité peut être réalisée.

try {
// some instructions
} catch(ATypeException|BTypeException|CTypeException ex) {
   throw e;
}

Ainsi, plusieurs exceptions dans une même clause de capture simplifient non seulement le code, mais réduisent également la redondance du code. J'ai trouvé cet article qui explique très bien cette fonctionnalité ainsi que sa mise en œuvre. Gestion améliorée et améliorée des exceptions à partir de Java 7 Cela peut aussi vous aider.

2
Saurab Parakh

Pour Java <7, vous pouvez utiliser if-else avec Exception:

try {
    // common logic to handle both exceptions
} catch (Exception ex) {
    if (ex instanceof Exception1 || ex instanceof Exception2) {

    }
    else {
        throw ex;
        // or if you don't want to have to declare Exception use
        // throw new RuntimeException(ex);
    }
}

Edité et remplacé Throwable avec Exception.

2
Sarel Botha

http://docs.Oracle.com/javase/tutorial/essential/exceptions/catch.html couvre la capture de plusieurs exceptions dans le même bloc.

 try {
     // your code
} catch (Exception1 | Exception2 ex) {
     // Handle 2 exceptions in Java 7
}

Je fais des cartes d'étude, et ce fil a été utile, je voulais juste mettre dans mes deux cents.

1
Eli