Estoy buscando una solución simple para hacer el registro de excepciones combinado con el manejo de errores en mi aplicación ASP.Net MVC 1.0.ASP.Net MVC Exception Logging combinado con manejo de errores
He leído muchos artículos, incluidas las preguntas publicadas aquí en StackOverflow, que proporcionan diversas soluciones para diferentes situaciones. Todavía no puedo encontrar una solución que se adapte a mis necesidades.
Éstos son mis requisitos:
Para poder utilizar el atributo [HandleError] (o su equivalente) en mi controlador, para manejar todas las excepciones que puedan ser lanzados desde cualquiera de las acciones o Vistas . Esto debería manejar todas las excepciones que no se manejaron específicamente en ninguna de las Acciones (como se describe en el punto 2). Me gustaría poder especificar a qué vista se debe redirigir a un usuario en casos de error, para todas las acciones en el controlador.
Quiero poder especificar el atributo [HandleError] (o algo equivalente) en la parte superior de Acciones específicas para atrapar excepciones específicas y redirigir a los usuarios a una Vista adecuada a la excepción. Todas las demás excepciones deben ser manejadas por el atributo [HandleError] en el controlador.
En ambos casos, quiero que las excepciones se registren usando log4net (o cualquier otra biblioteca de registro).
¿Cómo hago para lograr lo anterior? He leído acerca de hacer que todos mis Controladores hereden de un controlador base que anula el método OnException, y en el que hago mi registro. Sin embargo, esto complicará la tarea de redireccionar a los usuarios a las Vistas apropiadas o hacerlo desordenado.
He leído acerca de cómo escribir mi propia Acción de filtro que implementa IExceptionFilter para manejar esto, pero esto entrará en conflicto con el atributo [HandleError].
Hasta ahora, pienso que la mejor solución es escribir mi propio atributo heredado de HandleErrorAttribute. De esa manera, obtengo toda la funcionalidad de [HandleError] y puedo agregar mi propio log4net logging. La solución es la siguiente:
public class HandleErrorsAttribute: HandleErrorAttribute {
private log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception != null)
{
log.Error("Error in Controller", filterContext.Exception);
}
base.OnException(filterContext);
}
}
¿Funcionará el código anterior para mis requisitos? Si no, ¿qué solución cumple mis requisitos?
Bien, muchas gracias, voy a usar esto. – Kezzer
Sospecho que este código tiene un error en el que se supone que null no se devuelve para RouteData.Values ["action"] - al llamar .ToString() podría causar que el manejador de errores arroje una NullReferenceException. Nada es más frustrante que un controlador de error arrojar un error. –