Puis-je attraper plusieurs exceptions Java dans la même clause de saisie?
en Java, je veux faire quelque chose comme ça:
try {
...
} catch (IllegalArgumentException, SecurityException,
IllegalAccessException, NoSuchFieldException e) {
someCode();
}
...au lieu de:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
y a-t-il un moyen de faire ça?
9 réponses
C'est possible depuis Java 7 . La syntaxe pour le bloc try-catch est:
try {
...
} catch (IOException | SQLException ex) {
...
}
avant Java 7 ce n'était pas possible. Rappelez-vous cependant, si toutes les exceptions appartiennent à la même hiérarchie de classe, vous pouvez simplement attraper ce type d'exception de base. La seule autre façon consiste à attraper chaque exception dans son propre bloc de capture.
Edit: notez qu'en Java 7, vous ne pouvez pas attraper à la fois ExceptionA et ExceptionB dans le même bloc si L'ExceptionB est héritée, directement ou indirectement, de L'ExceptionA. Le compilateur se plaindra: The exception ExceptionB is already caught by the alternative ExceptionA
.
pas exactement avant Java 7 mais, je ferais quelque chose comme ça:
Java 6 et avant
try {
//.....
} catch (Exception exc) {
if (exc instanceof IllegalArgumentException || exc instanceof SecurityException ||
exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {
someCode();
} else if (exc instanceof RuntimeException) {
throw (RuntimeException) exc;
} else {
throw new RuntimeException(exc);
}
}
Java 7
try {
//.....
} catch ( IllegalArgumentException | SecurityException |
IllegalAccessException |NoSuchFieldException exc) {
someCode();
}
dans Java 7, vous pouvez définir plusieurs clauses de capture comme:
catch (IllegalArgumentException | SecurityException e)
{
...
}
Non, un par client.
vous pouvez attraper une superclasse, comme java.lang.Exception, tant que vous agissez de la même façon dans tous les cas.
try {
// some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
e.printStackTrace();
}
mais ce n'est peut-être pas la meilleure pratique. Vous ne devriez attraper une exception que lorsque vous avez une stratégie pour la manipuler réellement - et l'exploitation forestière et le repêchage ne sont pas "la manipuler". Si vous n'avez pas de mesures correctives, il est préférable de l'ajouter à la signature de la méthode et de la laisser remonter jusqu' quelqu'un qui peut gérer la situation.
S'il y a une hiérarchie d'exceptions, vous pouvez utiliser la classe de base pour saisir toutes les sous-classes d'exceptions. Dans le cas dégénéré vous pouvez attraper tous Java exceptions avec:
try {
...
} catch (Exception e) {
someCode();
}
dans un cas plus courant si RepositoryException est la classe de base et PathNotFoundException est une classe dérivée alors:
try {
...
} catch (RepositoryException re) {
someCode();
} catch (Exception e) {
someCode();
}
le code ci-dessus capturera Repoitoryexception et PathNotFoundException pour un type de la gestion des exceptions et toutes les autres exceptions sont regroupés. Depuis Java 7, selon la réponse de @OscarRyz ci-dessus:
try {
...
} catch( IOException | SQLException ex ) {
...
}
une alternative plus propre (mais moins verbeuse, et peut-être pas comme préféré) à la réponse de l'utilisateur 454322 sur Java 6 (i.e., Android) serait de capturer tous Exception
s et re-jeter RuntimeException
s. Cela ne fonctionnerait pas si vous planifiez de capturer d'autres types d'exceptions plus loin dans la pile (à moins que vous les rejetiez aussi), mais vous attraperez effectivement toutes les exceptions cochées .
par exemple:
try {
// CODE THAT THROWS EXCEPTION
} catch (Exception e) {
if (e instanceof RuntimeException) {
// this exception was not expected, so re-throw it
throw e;
} else {
// YOUR CODE FOR ALL CHECKED EXCEPTIONS
}
}
que ceci étant dit, pour verbosity, il pourrait être préférable de définir un booléen ou une autre variable et basé sur qui exécuter un certain code après le bloc try-catch.
dans pre-7 Que diriez-vous de:
Boolean caught = true;
Exception e;
try {
...
caught = false;
} catch (TransformerException te) {
e = te;
} catch (SocketException se) {
e = se;
} catch (IOException ie) {
e = ie;
}
if (caught) {
someCode(); // You can reference Exception e here.
}
Attraper l'exception de ce qui arrive à être un parent de la classe à l'exception de la hiérarchie. c'est bien sûr une mauvaise pratique . Dans votre cas, l'exception du parent commun se trouve être la classe D'Exception, et attraper toute exception qui est une instance D'Exception, est en effet une mauvaise pratique - les exceptions comme NullPointerException sont généralement des erreurs de programmation et devraient généralement être résolues en vérifiant les valeurs nulles.
Oui. Voici comment utiliser le séparateur pipe ( | ),
try
{
.......
}
catch
{
catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
}