Je suis actuellement en train de refactoriser un grand sous-système avec une architecture multi-couches, et j'ai du mal à concevoir une stratégie efficace de journalisation et de gestion des erreurs.
Disons que mon architecture se compose des trois couches suivantes:
- Interface publique (IE un contrôleur MVC)
- Couche de domaine
- Couche d'accès aux données
Ma source de confusion est l'endroit où je dois implémenter la journalisation des erreurs \ la gestion:
La solution la plus simple serait d'implémenter la journalisation au niveau supérieur (IE l'interface publique \ contrôleur MVC). Cependant, cela ne semble pas correct, car cela signifie faire remonter l'exception à travers les différentes couches, puis la journaliser; plutôt que d'enregistrer l'exception à sa source.
Consigner l'exception à sa source est évidemment la meilleure solution car j'ai le plus d'informations. Mon problème avec ceci est que je ne peux pas attraper toutes les exceptions à la source sans attraper TOUTES les exceptions, et dans la couche domaine / interface publique, cela conduira à intercepter les exceptions qui ont déjà été interceptées, enregistrées et relancées par la couche ci-dessous .
Une autre stratégie possible est un mélange de # 1 et # 2; par lequel j'attrape des exceptions spécifiques au niveau de la couche qu'elles sont les plus susceptibles d'être levées (IE Catching, logging et re-throwing
SqlExceptions
dans la couche d'accès aux données), puis j'enregistre toute autre exception non capturée au niveau supérieur. Cependant, cela nécessiterait également que j'attrape et reconnecte chaque exception au niveau supérieur, car je ne peux pas distinguer les erreurs qui ont déjà été enregistrées \ traitées de celles qui ne l'ont pas été.
Maintenant, évidemment, c'est un problème dans la plupart des applications logicielles, donc il doit y avoir une solution standard à ce problème qui se traduit par des exceptions interceptées à la source et enregistrées une fois; mais je ne vois pas comment faire cela moi-même.
Remarque, le titre de cette question est très similaire à " Journalisation des exceptions dans une application à plusieurs niveaux" ", mais les réponses dans ce message manquent de détails et ne sont pas suffisantes pour répondre à ma question.
The easiest solution would be to implement the logging at the top level
- fais ça. La journalisation des exceptions à leur source n'est pas une bonne idée et chaque application que j'ai rencontrée qui fait cela était un PITA à déboguer. Il devrait être de la responsabilité de l'appelant de gérer les exceptions.
try{ ... } catch(Exception ex) { Log(ex); }
entraînerait la même exception enregistrée dans chaque couche. (Cela semble également être une mauvaise pratique d'attraper chaque exception à chaque couche de la base de code.)