2009-10-30 16 views

risposta

3

Almeno con MVC 5, la risposta di @ tvanfosson non è più corretta. Questo può valere anche per le versioni precedenti.

OnActionExecuted viene sempre chiamato e ha accesso all'eccezione generata tramite filterContext.Exception.

caso di prova con l'eccezione in un'azione:

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); 
    } 
} 

uscita:

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

caso di prova con l'eccezione in 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); 
    } 
} 

uscita:

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

Grazie per l'aggiornamento di questo per MVC 5! – Patricia

Problemi correlati