2009-10-30 12 views

答えて

3

少なくともMVC 5では、@ tvanfossonの答えはもはや正しくありません。これは以前のバージョンにも当てはまります。

OnActionExecutedは常に呼び出され、filterContext.Exceptionでスローされた例外にアクセスします。動作中を除いて

テストケース:

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

出力:

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

除いてテストケースフィルタに

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

出力:

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

MVC 5のためにこれを更新していただきありがとうございます! – Patricia

関連する問題