Actualmente estoy refactorizando un subsistema grande con una arquitectura de varias capas, y estoy luchando por diseñar una estrategia efectiva de registro / manejo de errores.
Digamos que mi arquitectura consta de las siguientes tres capas:
- Interfaz pública (es decir, un controlador MVC)
- Capa de dominio
- Capa de acceso a datos
Mi fuente de confusión es donde debería implementar el registro de errores \ manejo:
La solución más fácil sería implementar el registro en el nivel superior (es decir, la Interfaz pública \ Controlador MVC). Sin embargo, esto se siente mal porque significa aumentar la excepción a través de las diferentes capas y luego iniciar sesión; en lugar de registrar la excepción en su origen.
Obviamente, registrar la excepción en su origen es la mejor solución porque tengo la mayor cantidad de información. Mi problema con esto es que no puedo capturar todas las excepciones en el origen sin capturar TODAS las excepciones, y en la capa de dominio / interfaz pública, esto conducirá a capturar excepciones que ya se han capturado, registrado y relanzado por la capa a continuación .
Otra posible estrategia es una combinación de # 1 y # 2; por el cual capturo excepciones específicas en la capa que tienen más probabilidades de ser lanzadas (IE Catching, logging y re-throwing
SqlExceptions
en Data Access Layer) y luego registro cualquier excepción no detectada en el nivel superior. Sin embargo, esto también requeriría que detecte y registre cada excepción en el nivel superior, porque no puedo distinguir entre los errores que ya se han registrado \ manejado y los que no.
Ahora, obviamente, este es un problema en la mayoría de las aplicaciones de software, por lo que debe haber una solución estándar para este problema que dé como resultado que las excepciones se detecten en el origen y se registren una vez; Sin embargo, no puedo ver cómo hacerlo yo mismo.
Tenga en cuenta que el título de esta pregunta es muy similar a ' Excepciones de registro en una aplicación de varios niveles " ', sin embargo, las respuestas en esa publicación carecen de detalles y no son suficientes para responder a mi pregunta.
The easiest solution would be to implement the logging at the top level
- hacer esto. Las excepciones de registro en su origen no son una buena idea y cada aplicación que he encontrado que hace esto fue una PITA para depurar. Debería ser responsabilidad de la persona que llama manejar las excepciones.
try{ ... } catch(Exception ex) { Log(ex); }
resultado resultaría en la misma excepción que se registra en cada capa. (También parece una práctica bastante mala detectar todas las excepciones en cada capa de la base de código).