90 votes

Qu'est-ce qu'une exception supprimée?

Un commentaire (par l'utilisateur soc) sur une réponse à une question sur la queue d'appel d'optimisation mentionné que Java 7 a une nouvelle fonctionnalité appelée "supprimé exceptions", en raison de "l'addition de BRAS" (support pour les Processeurs ARM?).

Qu'est ce qu'un "supprimé exception" dans ce contexte? Dans d'autres contextes, un "supprimé" l'exception serait une exception qui a été pris et alors ignorée (presque toujours mal); c'est clairement quelque chose de différent.

81voto

John B Points 17042

Afin de clarifier la citation de Jon réponse, une seule exception peut être levée par une méthode (pour exécution), mais il est possible dans le cas d'un try-with-resources pour plusieurs exceptions à être jeté (on peut être jeté dans le bloc et une autre pourrait être levée à partir de l'implicite finally fournis par le try-with-resources). Le compilateur doit déterminer lequel de ces "vraiment" jeter. Il choisit de lancer l'exception soulevée dans l'explicite (le code dans le bloc try) plutôt que celui lancé par le code implicite (le bloc finally). Par conséquent, l'exception(s) jeté dans l'implicite bloc sont supprimées (ignoré). Le produit uniquement dans le cas de plusieurs exceptions.

58voto

Jon Skeet Points 692016

Je crois que l'auteur fait référence à une exception qui est semi-ignoré quand il est lancé au sein de l'implicite finally bloc d'un try-with-resources bloc, dans le contexte d'une exception levée de l' try bloc:

Une exception peut être lancée à partir du bloc de code associé avec le try-with-resources déclaration. Dans l'exemple writeToFileZipFileContents, une exception peut être levée à partir du bloc try, et jusqu'à deux exceptions peuvent être lancés depuis le try-with-resources déclaration quand on essaie de fermer le ZipFile et BufferedWriter objets. Si une exception est renvoyée par le bloc try et un ou plusieurs des exceptions sont levées à partir de l'essayer-avec-les ressources de l'instruction, puis ceux des exceptions lancées depuis le try-with-resources déclaration sont supprimées, et l'exception levée par le bloc est celui qui s'est jeté par la writeToFileZipFileContents méthode. Vous pouvez récupérer ces supprimé des exceptions par l'appel de la Lancer.getSuppressed méthode de l'exception levée par le bloc try.

(C'est une citation d'un article appelé "Supprimer les Exceptions" à partir de la page liée.)

9voto

Dan Cruz Points 7016

Supprimé des exceptions supplémentaires sont les exceptions qui se produisent à l'intérieur d'un try-with-resources déclaration (introduit dans Java 7) lorsqu' AutoCloseable des ressources sont fermés. Parce que plusieurs exceptions peuvent se produire lors de la fermeture de AutoCloseable des ressources, des exceptions supplémentaires qui sont attachés à un primaire d'exception comme étant supprimés exceptions.

En regardant le pseudo-code d'un morceau de try-with-resources code de l'échantillon, la norme de la JVM, les gestionnaires d'exception sont utilisés pour accueillir le try-with-resources sémantique.

0voto

user2179737 Points 11

Vous pouvez supprimer les Exceptions en Java 6 (avec un peu de ruse impliqués),

J'ai créé un utilitaire qui gère de manière transparente la suppression de l'exception dans la version 1.6 de Java et Java 1.7. Vous pouvez trouver à la mise en œuvre ici

Tous vous avez besoin est l'appel de:

public static <T extends Throwable> T suppress(final T t, final Throwable suppressed) 

pour supprimer une exception, et

public static Throwable [] getSuppressed(final Throwable t) {

pour obtenir le supprimé exceptions une Exception, dans le cas où quelqu'un utilise encore la version 1.6 de Java

-1voto

Je pense que cela a à voir avec "l'installation d'exception chaînée". Cela affectera la manière dont une exception gérera une exception à mesure que la trace de la pile évolue. Au fil du temps, les exceptions faisant partie d'un groupe d'exceptions chaînées peuvent être supprimées. Consultez la documentation Throwable pour plus de détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X