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?

572
demandé sur froadie 2010-08-16 22:07:03

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 .

935
répondu OscarRyz 2017-07-12 18:48:46

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();
}
99
répondu user454322 2014-03-03 04:04:53

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

catch (IllegalArgumentException | SecurityException e)
{
    ...
}
23
répondu crusam 2011-11-21 22:27:35

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.

13
répondu duffymo 2016-04-18 19:02:02

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 ) { 
  ...
}
13
répondu Michael Shopsin 2017-02-05 03:01:00

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.

8
répondu Oleg Vaskevich 2015-08-28 17:18:02

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.
  }
3
répondu Bill S 2015-02-16 18:08:04

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.

0
répondu Vineet Reynolds 2017-05-23 11:55:01

Oui. Voici comment utiliser le séparateur pipe ( | ),

try
{
    .......
}    
catch
{
    catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
}
0
répondu Shiva 2018-09-29 12:54:18