2009-10-30 12 views

Respuesta

3

Al menos con MVC 5, la respuesta de @tvanfosson ya no es correcta. Esto también puede aplicarse a versiones anteriores.

OnActionExecuted siempre se llama y tiene acceso a la excepción lanzada a través de filterContext.Exception.

caso de prueba con excepción en una acción:

public class HomeController 
    : Controller 
{ 
    public ActionResult Index() 
    { 
     throw new Exception("Index"); 
    } 
} 

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new Foo()); 
     filters.Add(new Bar()); 
    } 
} 

public class Foo 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

public class Bar 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

de salida:

caso de prueba
Bar.OnActionExecuting 
Foo.OnActionExecuting 
Exception thrown: 'System.Exception' in WebApplication1.dll 
Foo.OnActionExecuted 
Has exception: True 
Bar.OnActionExecuted 
Has exception: True 

con excepción en un filtro

public class HomeController 
    : Controller 
{ 
    public ActionResult Index() 
    { 
     return new HttpStatusCodeResult(200); 
    } 
} 

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new Foo()); 
     filters.Add(new Bar()); 
    } 
} 

public class Foo 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     throw new Exception("Foo"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

public class Bar 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

de salida:

Bar.OnActionExecuting 
Foo.OnActionExecuting 
Foo.OnActionExecuted 
Has exception: False 
Exception thrown: 'System.Exception' in WebApplication1.dll 
Bar.OnActionExecuted 
Has exception: True 
+0

¡Gracias por actualizar esto para MVC 5! – Patricia

Cuestiones relacionadas