Ceci est similaire aux autres réponses, mais sans le drapeau, qui semble comme l'encombrement pour moi. Je ne comprends pas vraiment la question, alors je la jette juste là au cas où cela serait utile.
for (Item item : items) {
while (true) {
try {
item.doSomething();
break;
} catch (MyException ex) {
log.warn("Something failed.", ex);
}
}
}
Cette approche repose sur le fonctionnement de la déclaration break
sans étiquette, qui complète brusquement, quitte ensuite la déclaration while
enfermant normalement.
D'après les commentaires suivants, je pense qu'il ya une certaine confusion au sujet de ce que cela signifie quand il y a plusieurs exceptions déclarées à être jeté par une méthode.
Chaque invocation d'une méthode peut être terminée par une seule exception levée. Vous ne pouvez pas reprendre l'invocation là où elle s'est arrêtée et gérer les exceptions suivantes. Par conséquent, si une méthode génère plusieurs exceptions, attrapez un ancêtre commun et passez à l'étape suivante. Par exemple, si une méthode renvoie java.io.EOFException
oujava.nio.channels.ClosedChannelException
, vous pouvez simplement saisir java.io.IOException
car il s'agit d'un ancêtre commun. (Vous pouvez aussi saisir java.lang.Exception
ou java.lang.Throwable
pour la même raison.) Si vous invoquez à nouveau la méthode dans les mêmes conditions, vous n'aurez plus rien à faire.
Si vous voulez tenter d'invoquer la méthode sur chaque objet, même si certains échouent, utilisez ceci:
for (Item item : items) {
try {
item.doSomething();
} catch (Exception ex) { /* This could be any common ancestor. */
log.warn("Something failed.", ex);
}
}
Qu'entendez-vous par «attraper la première exception, s'il n'y a plus d'exceptions pour attraper ...»? * Une invocation de méthode * ne peut renvoyer qu'une seule exception *, donc "first" et "more" n'ont pas de sens dans le contexte de "invoke method". – erickson
La méthode émet une exception avec plusieurs sous-classes/sous-exceptions. – aperson