No momento, estou refatorando um grande subsistema com uma arquitetura de várias camadas e estou lutando para criar uma estratégia eficaz de registro de erros \ manipulação.
Digamos que minha arquitetura consiste nas três camadas a seguir:
- Interface pública (IE um controlador MVC)
- Camada de domínio
- Camada de acesso a dados
Minha fonte de confusão é onde eu devo implementar o log de erros \ manipulação:
A solução mais fácil seria implementar o log no nível superior (ou seja, Public Interface \ MVC Controller). No entanto, isso parece errado, porque significa modificar a exceção através das diferentes camadas e depois registrá-la; em vez de registrar a exceção na origem.
Registrar a exceção na fonte é obviamente a melhor solução, porque eu tenho mais informações. Meu problema é que não consigo capturar todas as exceções na origem sem capturar TODAS as exceções, e na camada de domínio / interface pública, isso levará à captura de exceções que já foram capturadas, registradas e reproduzidas pela camada abaixo .
Outra estratégia possível é uma mistura de # 1 e # 2; onde pego exceções específicas na camada com maior probabilidade de serem lançadas (captura do IE, registro e re-lançamento
SqlExceptions
na camada de acesso a dados) e, em seguida, registro quaisquer outras exceções não capturadas no nível superior. No entanto, isso também exigiria que eu capturasse e registrasse novamente todas as exceções no nível superior, porque não consigo distinguir entre os erros que já foram registrados \ manipulados e os que não o fizeram.
Agora, obviamente, esse é um problema na maioria dos aplicativos de software; portanto, deve haver uma solução padrão para esse problema que resulte em exceções capturadas na origem e registradas uma vez; no entanto, eu simplesmente não consigo ver como fazer isso sozinho.
Observe que o título desta pergunta é muito semelhante a ' Exceções de log em um aplicativo de várias camadas " ', no entanto, as respostas nessa postagem estão sem detalhes e não são suficientes para responder à minha pergunta.
The easiest solution would be to implement the logging at the top level
- faça isso. Registrar exceções na origem não é uma boa ideia e todos os aplicativos que encontrei que fazem isso eram um PITA para depuração. Deve ser responsabilidade do chamador lidar com exceções.
try{ ... } catch(Exception ex) { Log(ex); }
resultaria na mesma exceção sendo registrada em cada camada. (Ele também parece ser bastante ruim prática para ser captura cada exceção em todas as camadas na base de código.)