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


En Java, je veux faire quelque chose comme ceci:

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 le faire?

Author: froadie, 2010-08-16

9 answers

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

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

Avant Java 7, cela n'était pas possible. Rappelez-vous cependant, si toutes les exceptions appartiennent à la même hiérarchie de classes, vous pouvez simplement attraper ce type d'exception de base. La seule autre façon est d'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 ExceptionB est hérité, directement ou indirectement, de ExceptionA. Le compilateur se plaindra: The exception ExceptionB is already caught by the alternative ExceptionA.

 935
Author: 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
Author: user454322, 2014-03-03 04:04:53

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

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

Non, un par client.

Vous pouvez attraper une superclasse, comme java.lang.Exception, tant que vous effectuez 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 lorsque vous avez une stratégie pour la gérer réellement - et que la journalisation et la rethrowing ne la "gèrent"pas. Si vous n'avez pas d'action corrective, mieux vaut l'ajouter à la signature de la méthode et la laisser bouillonner jusqu'à quelqu'un qui peut gérer la situation.

 13
Author: duffymo, 2016-04-18 19:02:02

S'il existe une hiérarchie d'exceptions, vous pouvez utiliser la classe de base pour attraper toutes les sous-classes d'exceptions. Dans le cas dégénéré, vous pouvez attraper toutes les exceptions Java 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 interceptera RepositoryException et PathNotFoundException pour un type de gestion des exceptions et toutes les autres exceptions sont regroupées. Depuis Java 7, selon la réponse de @OscarRyz ci-dessus:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}
 13
Author: Michael Shopsin, 2017-02-05 03:01:00

Une alternative plus propre (mais moins verbeuse, et peut-être pas comme préférée) à la réponse de user454322 sur Java 6 (c'est-à-dire Android) serait d'attraper tous les Exceptions et de relancer RuntimeExceptions. Cela ne fonctionnerait pas si vous prévoyez d'attraper d'autres types d'exceptions plus haut dans la pile (sauf si vous les

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 pourrait être préférable de définir un booléen ou un autre variable et basé sur cela exécuter du code après le bloc try-catch.

 8
Author: Oleg Vaskevich, 2015-08-28 17:18:02

Dans pre-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
Author: Bill S, 2015-02-16 18:08:04

Intercepte l'exception qui se trouve être une classe parente dans la hiérarchie des exceptions. C'est bien sûr une mauvaise pratique. Dans votre cas, l'exception parent commune se trouve être la classe 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 doivent généralement être résolues en vérifiant les valeurs null.

 0
Author: Vineet Reynolds, 2017-05-23 11:55:01

Oui. Voici la façon d'utiliser le séparateur pipe ( | ),

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