41 votes

Directives sur la propagation des exceptions (en Java)

Existe-il des lignes directrices sur la propagation d'exception en Java?

Quand pensez-vous d'ajouter une exception à la signature de la méthode? Par exemple: si une exception n'est levée lorsqu'un programme essentiel des ressources est manquant, et ne peuvent être traitées au plus haut niveau, dois-je le propager à travers toutes les méthodes à l'aide de cette exception par le biais de toutes les méthodes à l'aide de l'égaré méthode?

Existe-il des bonnes pratiques? Toutes les mauvaises pratiques?

Je suis désolé si je suis vague, mais je suis juste à la recherche pour certains (en général) des conseils sur le style de programmation concernant les exceptions.

52voto

Vineet Reynolds Points 40529

Les lignes directrices qui m'ont aidé dans le passé incluent:

  • Lancer des exceptions lorsque la méthode ne peut pas gérer l'exception, et, plus important encore, devraient être traitées par l'appelant. Un bon exemple de ce qui se passe à présent dans la Servlet API - doGet() et doPost() throw ServletException ou IOException dans certains cas où la demande ne peut pas être lu correctement. Aucune de ces méthodes ne sont en mesure de gérer l'exception, mais le conteneur (qui se traduit par la 50x page d'erreur dans la plupart des cas).
  • La bulle de l'exception, si la méthode ne peut pas le gérer. C'est un corollaire de ce qui précède, mais applicable à des méthodes qui doivent attirer l'exception. Si l'exception interceptée ne peuvent pas être traitées correctement par la méthode, alors il est préférable de bulle.
  • Jeter l'exception tout de suite. Cela peut sembler vague, mais si une exception scénario est rencontré, alors c'est une bonne pratique pour lancer une exception indiquant le point d'origine de l'échec, au lieu de tenter de gérer la défaillance via des codes d'erreur, jusqu'à ce qu'un point susceptible de lancer une exception. En d'autres termes, tenter de réduire au minimum le mixage de gestion de l'exception avec la gestion des erreurs.
  • Soit le journal de l'exception ou de la bulle, mais ne pas faire les deux. L'enregistrement d'une exception indique souvent que la pile d'exception a été complètement démantelée, indiquant qu'aucun autre bouillonnement de l'exception s'est produite. Par conséquent, il n'est pas recommandé de faire les deux en même temps, car elle conduit souvent à une expérience frustrante au débogage.
  • L'utilisation des sous-classes de java.lang.Exception (checked exceptions), vous avez, à l'exception de l'appelant pour gérer l'exception. Il en résulte que le compilateur lancer un message d'erreur si l'appelant n'a pas à gérer l'exception. Attention cependant, c'est généralement le résultat de développeurs "d'avaler" les exceptions dans le code.
  • L'utilisation des sous-classes de java.lang.RuntimeException (case non cochée exceptions) pour signaler les erreurs de programmation. Les classes d'exception qui sont recommandés ici sont l' exception IllegalStateException, IllegalArgumentException, UnsupportedOperationException etc. Encore une fois, il faut être prudent quant à l'utilisation des classes d'exception comme NullPointerException (presque toujours une mauvaise idée de jeter un).
  • Exception pour l'utilisation par les hiérarchies de classe pour communiquer de l'information sur les exceptions à travers les différents niveaux. Par la mise en œuvre d'une hiérarchie, vous peut généraliser le comportement de gestion des exceptions en l'appelant. Par exemple, vous pouvez utiliser une racine d'exception comme DomainException qui a plusieurs sous-classes comme InvalidCustomerException, InvalidProductException etc. L'inconvénient ici est que votre exception de la hiérarchie peut exploser très rapidement si vous représenter chaque exceptionnels scénario comme une autre exception.
  • Éviter d'attraper les exceptions vous ne pouvez pas gérer. Assez évident, mais beaucoup de développeurs essayer de l'attraper java.lang.Exception ou java.lang.Throwable. Puisque tous les sous-classé des exceptions peuvent être pris, le comportement d'exécution de l'application peut souvent être vague lors de la "global" des classes d'exception sont pris. Après tout, on ne voudrait pas attraper OutOfMemoryError - comment doit-on gérer une telle exception?
  • Envelopper les exceptions avec soin. Renvoi une exception réinitialise la pile d'exception. À moins que la cause initiale a été fournie à l'exception de l'objet, il est perdu à jamais. Afin de préserver l'exception de la pile, on devra fournir à l'exception d'origine de l'objet de la nouvelle exception du constructeur.
  • Convertir checked exceptions dans décoché seulement lorsque nécessaire. En enveloppant une exception, il est possible d'encapsuler un checked exception et de jeter un décoché un. C'est utile dans certains cas, notamment lorsque l'intention est d'interrompre le thread en cours d'exécution. Cependant, dans d'autres scénarios, ce qui peut causer un peu de la douleur, pour le compilateur n'est pas vérifiée. Par conséquent, l'adaptation d'un checked exception comme une décoché l'on n'est pas censé être fait à l'aveuglette.

2voto

Colin Hebert Points 40084

Vous devriez manipuler la méthode dès que possible, mais cela doit avoir un sens. Si l'exception n'a pas de sens si elle est générée par votre méthode, mais que vous ne pouvez pas la gérer, intégrez-la dans une autre exception et lancez cette nouvelle exception.

Une mauvaise pratique à propos de l'exception consiste à toutes les attraper (ce n'est pas pokemon, c'est java!), Alors évitez catch(Exception e) ou pire catch(Throwable t) .

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