Attualmente sto eseguendo il refactoring di un sottosistema di grandi dimensioni con un'architettura a più livelli e sto lottando per progettare un'efficace strategia di gestione e registrazione degli errori.
Diciamo che la mia architettura è composta dai seguenti tre livelli:
- Interfaccia pubblica (IE un controller MVC)
- Livello di dominio
- Livello di accesso ai dati
La mia fonte di confusione è dove dovrei implementare la registrazione e la gestione degli errori:
La soluzione più semplice sarebbe quella di implementare la registrazione al livello più alto (ovvero l'interfaccia pubblica \ controller MVC). Tuttavia, questo sembra sbagliato perché significa gorgogliare l'eccezione attraverso i diversi livelli e quindi registrarla; piuttosto che registrare l'eccezione alla sua fonte.
Registrare l'eccezione alla sua fonte è ovviamente la soluzione migliore perché ho la maggior parte delle informazioni. Il mio problema con questo è che non riesco a catturare tutte le eccezioni alla fonte senza catturare TUTTE le eccezioni, e nel livello dell'interfaccia pubblico / di dominio, questo porterà a catturare le eccezioni che sono già state catturate, registrate e ri-generate dal livello sottostante .
Un'altra possibile strategia è un mix di # 1 e # 2; per cui rilevo specifiche eccezioni a livello che molto probabilmente vengono generate (cattura IE, registrazione e rilancio
SqlExceptions
nel livello di accesso ai dati) e quindi registro tutte le ulteriori eccezioni non rilevate al livello superiore. Tuttavia, ciò richiederebbe anche di rilevare e registrare nuovamente ogni eccezione al livello più alto, perché non riesco a distinguere tra errori che sono già stati registrati \ gestiti rispetto a quelli che non lo sono.
Ora, ovviamente, questo è un problema nella maggior parte delle applicazioni software, quindi ci deve essere una soluzione standard a questo problema che si traduca in eccezioni catturate alla fonte e registrate una volta; tuttavia non riesco proprio a vedere come farlo da solo.
Nota, il titolo di questa domanda è molto simile a " Registrazione delle eccezioni in un'applicazione multilivello" ", tuttavia le risposte in quel post mancano di dettagli e non sono sufficienti per rispondere alla mia domanda.
The easiest solution would be to implement the logging at the top level
- Fai questo. La registrazione delle eccezioni alla loro fonte non è una buona idea e ogni applicazione che ho riscontrato è stata una PITA per il debug. Dovrebbe essere responsabilità del chiamante gestire le eccezioni.
try{ ... } catch(Exception ex) { Log(ex); }
otterrebbe la stessa eccezione registrata su ogni livello. (Sembra anche una cattiva pratica catturare ogni eccezione in ogni livello della base di codice.)