En una aplicación MVC3 web que estaba usandoMVC [HandleError] HandleErrorAttribute llamado dos veces al utilizar registro global
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
de aplicar el tratamiento de errores global donde el usuario se muestra la vista 'error' si una excepción no controlada se produjo.
Para una vista particular, también quería que se mostrara una vista de error diferente si se producía una excepción no controlada decorando el método con [HandleError(View = "SpecialError")]
. Esto funcionó bien.
Luego quería agregar el registro global de excepciones no controladas. He creado un atributo personalizado HandleError con código de registro:
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Write to log code
base.OnException(context);
}
}
y actualizada RegisterGlobalFilters y la decoración método para utilizar este nombre de atributo en su lugar. Esto funciona en general, pero cuando ocurre una excepción dentro del método que está decorado con MyHandleError(View = "SpecialError")]
, el método OnException se llama dos veces. Originalmente asumí que decorar el método con este atributo reemplazó al controlador global, pero parece que simplemente se agrega (lo cual tiene más sentido, pero no es lo que quiero). Al llamar a OnException dos veces, la misma excepción se registra dos veces, lo que no debe suceder. No creo que OnException se llame dos veces porque es un atributo personalizado: creo que esto también ocurre con el atributo HandleError estándar, ahora es simplemente visible ya que estoy creando un registro de él.
En última instancia, deseo registrar todas las excepciones no controladas (una vez), conservando las funciones ofrecidas por [HandleError], en particular estableciendo diferentes vistas para excepciones de métodos particulares. ¿Hay una manera limpia de hacer esto?
¡Gracias! Esto funcionó para mí también. – abjbhat
Hola, gran solución, pero ¿cómo puedes obtener más información del origen de la excepción como el nombre de clase/método? – Patrick