Ich überarbeite derzeit ein großes Subsystem mit einer mehrschichtigen Architektur und habe Mühe, eine wirksame Strategie für die Fehlerprotokollierung und -behandlung zu entwickeln.
Angenommen, meine Architektur besteht aus den folgenden drei Ebenen:
- Öffentliche Schnittstelle (IE und MVC-Controller)
- Domänenschicht
- Datenzugriffsschicht
Meine Verwirrung ist, wo ich die Fehlerprotokollierung implementieren soll:
Die einfachste Lösung wäre, die Protokollierung auf der obersten Ebene zu implementieren (IE, Public Interface \ MVC Controller). Dies fühlt sich jedoch falsch an, da es bedeutet, die Ausnahme durch die verschiedenen Ebenen zu sprudeln und sie dann aufzuzeichnen. anstatt die Ausnahme an der Quelle zu protokollieren.
Es ist offensichtlich die beste Lösung, die Ausnahme an der Quelle zu protokollieren, da ich die meisten Informationen habe. Mein Problem dabei ist, dass ich nicht jede Ausnahme an der Quelle abfangen kann, ohne ALLE Ausnahmen abzufangen. Auf der Ebene der Domäne / öffentlichen Schnittstelle führt dies dazu, dass Ausnahmen abgefangen werden, die von der darunter liegenden Ebene bereits abgefangen, protokolliert und erneut ausgelöst wurden .
Eine andere mögliche Strategie ist eine Mischung aus # 1 und # 2; Dabei fange ich bestimmte Ausnahmen auf der Ebene ab, auf der sie höchstwahrscheinlich ausgelöst werden (IE-Catching, Protokollierung und erneutes Auslösen
SqlExceptions
auf der Datenzugriffsebene), und protokolliere dann alle weiteren nicht erfassten Ausnahmen auf der obersten Ebene. Dies würde jedoch auch erfordern, dass ich jede Ausnahme auf oberster Ebene abfange und erneut protokolliere, da ich nicht zwischen Fehlern, die bereits protokolliert wurden, und Fehlern, die noch nicht behandelt wurden, unterscheiden kann.
Dies ist offensichtlich ein Problem in den meisten Softwareanwendungen. Daher muss es eine Standardlösung für dieses Problem geben, die dazu führt, dass Ausnahmen an der Quelle abgefangen und einmal protokolliert werden. Ich kann jedoch nicht sehen, wie ich das selbst machen soll.
Beachten Sie, dass der Titel dieser Frage " Ausnahmen in einer mehrschichtigen Anwendung protokollieren" sehr ähnlich ist , die Antworten in diesem Beitrag jedoch nicht detailliert genug sind, um meine Frage zu beantworten.
The easiest solution would be to implement the logging at the top level
- mach das. Das Protokollieren von Ausnahmen an ihrer Quelle ist keine gute Idee, und jede Anwendung, auf die ich gestoßen bin, die dies tut, war ein PITA zum Debuggen. Es sollte in der Verantwortung des Anrufers liegen, Ausnahmen zu behandeln.
try{ ... } catch(Exception ex) { Log(ex); }
würde dazu führen, dass auf jeder Ebene dieselbe Ausnahme protokolliert wird. (Es scheint auch eine ziemlich schlechte Praxis zu sein, jede Ausnahme auf jeder Ebene der Codebasis