Question Puis-je attraper plusieurs exceptions Java dans la même clause catch?


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();
}

Est-ce qu'il y a un moyen de faire ça?


559
2017-08-16 18:07


origine


Réponses:


C'est possible depuis Java 7. La syntaxe du bloc try-catch est la suivante:

try { 
  ...
} catch (IOException | SQLException ex) { 
  ...
}

Avant Java 7, ce n'était pas possible. Souvenez-vous cependant que si toutes les exceptions appartiennent à la même hiérarchie de classes, vous pouvez simplement attraper ce type d'exception de base. Le seul autre moyen consiste à attraper chaque exception dans son propre bloc catch.

Edit: Notez que dans Java 7, vous ne pouvez pas capturer ExceptionA et ExceptionB dans le même bloc si ExceptionB est héritée, directement ou indirectement, d'ExceptionA. Le compilateur va se plaindre: The exception ExceptionB is already caught by the alternative ExceptionA.


918
2017-08-16 18:11



Pas exactement avant Java 7 mais, je ferais quelque chose comme ceci:

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();
}

98
2017-08-28 09:15



Dans Java 7, vous pouvez définir plusieurs clauses de capture comme:

catch (IllegalArgumentException | SecurityException e)
{
    ...
}

23
2017-08-16 18:12



Non, un par client.

Vous pouvez attraper une superclasse, comme java.lang.Exception, à condition de prendre la même action 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 si vous avez une stratégie pour la gérer. La journalisation et la réitération ne la traitent pas. Si vous ne disposez pas d'une action corrective, il est préférable de l'ajouter à la signature de la méthode et de laisser le problème surgir à quelqu'un qui peut gérer la situation.


14
2017-08-16 18:09



S'il existe une hiérarchie d'exceptions, vous pouvez utiliser la classe de base pour capturer toutes les sous-classes d'exceptions. Dans le cas dégénéré, vous pouvez attraper tout Exceptions Java avec:

try {
   ...
} catch (Exception e) {
   someCode();
}

Dans un cas plus commun 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 va récupérer ReceptionException et PathNotFoundException pour un type de gestion des exceptions et toutes les autres exceptions sont regroupées. Depuis Java 7, selon la réponse @ OscarRyz ci-dessus:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}

13
2017-08-16 18:12



Une alternative plus simple (mais moins verbeuse, et peut-être pas aussi préférée) à la réponse de user454322 sur Java 6 (c'est-à-dire, Android) serait d'attraper tous Exceptions et re-jeter RuntimeExceptions. Cela ne fonctionnerait pas si vous prévoyez d'attraper d'autres types d'exceptions plus loin dans la pile (sauf si vous les relancez également), vérifié des exceptions.

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
    } 
}

Cela étant dit, pour la verbosité, il peut être préférable de définir une variable booléenne ou une autre variable et d'exécuter du code après le bloc try-catch.


8
2017-10-18 21:04



En pré-7 que diriez-vous:

  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.
  }

3
2018-02-16 18:08



Attrape l'exception qui se trouve être une classe parente dans la hiérarchie des exceptions. Ceci est bien sûr, une mauvaise pratique. Dans votre cas, l'exception parent commun est la classe Exception, et l'interception d'une exception Exception est en effet une mauvaise pratique - des exceptions comme NullPointerException sont généralement des erreurs de programmation et doivent généralement être résolues en vérifiant les valeurs nulles.


0
2017-08-16 18:10