Architecture de gestion des exceptions pour les projets Java EE

J’essaie de rassembler des informations sur la manière dont d’autres programmeurs Java EE gèrent leurs exceptions. Est-ce que vous centralisez le traitement des erreurs (par exemple, un filtre Servlet)?

Créez-vous différents types d’exceptions pour les différentes couches d’application (persistance, service, etc.)?

Est-ce que vous avalez juste les exceptions et ne les lancez pas du tout?

Quels autres paradigmes existe-t-il dans l’architecture de gestion des exceptions? Lequel utilisez-vous et pourquoi?

La couche de persistance, si elle est implémentée à l’aide de JPA ou de Hibernate, possède déjà ses propres exceptions, qui sont des exceptions d’exécution.

La couche service génère des exceptions d’exécution lorsque des arguments illégaux sont passés (lorsqu’elles sont supposées être validées par la couche de présentation) ou des exceptions vérifiées lorsqu’une erreur récupérable se produit (exemple: le nom choisi existe déjà dans la firebase database).

Chaque contrôleur de la couche de présentation traite les exceptions vérifiées émises par les services métier qu’il appelle, pour fournir un message d’erreur significatif et permettre à l’utilisateur de récupérer l’erreur (exemple: afficher à nouveau le formulaire et lui demander de choisir un autre nom. )

Toutes les autres exceptions d’exécution, provenant de la couche de présentation, de la couche métier ou de la couche de persistance, sont gérées par un ou plusieurs gestionnaires d’exceptions globaux (la plupart des infrastructures d’interface utilisateur les prennent en charge), qui enregistre l’exception et génère une erreur plus ou moins générique. message (exemple: “Une erreur inattendue s’est produite”, “Un autre utilisateur a modifié ou supprimé l’object que vous avez tenté de modifier”).

Les exceptions sont de l’or pur pour vous qui tentez de découvrir ce qui ne va pas. Traitez-les en conséquence!

Les exceptions à la déglutition ne sont acceptables que dans les très rares cas, où il s’agit en fait de l’action appropriée.

Les exceptions cochées en Java vous obligent généralement à réfléchir à la manière de gérer les erreurs proches de l’emplacement où elles se sont réellement produites. Notez qu’il peut être parfaitement acceptable de placer l’exception dans une exception DomainException (ou une sous-classe appropriée de celle-ci) et de l’envoyer vers un emplacement capable de la gérer et de la récupérer avec élégance.

Dans la plupart des cas, vous avez le plus grand nombre d’essais-captures qui vous permettent d’attraper toutes les exceptions et de les gérer. C’est pourquoi il est si important de fournir autant de logique (en l’enveloppant dans une exception qui a du sens pour vous), afin que ce gestionnaire puisse agir en conséquence.

Pour les cas connus, l’action appropriée peut alors être prise.

Pour les cas inconnus, il s’agit d’une défaillance très forte, car votre système est dans un état inattendu. Connectez-vous autant que vous le pouvez – car vous ne pourrez peut-être pas le reproduire autrement – et entrez dans un état approprié (sortie, refus du service ou maintien comme il convient pour votre modèle).

Je décourage fortement la pratique de déglutition des exceptions. C’est le meilleur moyen de perdre autant de temps à rechercher l’origine d’un problème. J’ai eu tellement de moments wtf où j’ai finalement trouvé l’exception cachée dans une clause de capture vide. Je suis d’accord avec Thorbjørn en ce qui concerne le fait que la plupart du temps, vous n’avez qu’un seul essai. À l’intérieur, je me retrouve à utiliser de nombreuses méthodes qui peuvent générer des exceptions et, pour éviter le code de traitement des erreurs, je préfère intercepter les exceptions juste en haut.
À propos de la centralisation , je pense que vos fichiers journaux devraient être suffisamment centraux.