如何处理过滤器中发生的异常?

时间:2016-08-30 12:05:29

标签: c# .net asp.net-mvc exception-handling action-filter

在网页遇到控制器操作之前,我有各种过滤器。

很少有过滤器具有复杂的逻辑,可能会抛出异常。

现在,我如何捕捉这些例外?

例如。我有一个过滤器来处理控制器方法中发生的异常。

[ActionFilter1]是一个过滤器,用于处理控制器方法中发生的任何异常。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{

 //exception occuring here

}

一种方法是做这样的事情:

public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
     try {
     //exception occuring here
     }
     catch {
     //log here
     }
    }

由于有n个过滤器,我不想重复添加try&的这种逻辑。 catch到每个过滤器。

在这种情况下,如何进行单一位置错误处理,可以处理所有这些过滤器中发生的异常?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

添加Divya的回答/评论,这是我的发现:

代码段:

[Filter1, Filter2, MyErrorFilter]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            //throw new Exception("Poda!");
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }

    public class Filter1 : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Console.WriteLine("filter1-action executing!!");
            base.OnActionExecuting(filterContext);
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Console.WriteLine("filter1-action executed!!!");
            base.OnActionExecuted(filterContext);
        }
    }

    public class Filter2: ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Console.WriteLine("filter2-action executing!!!");
            throw new Exception("poda!!1");
            base.OnActionExecuting(filterContext);
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Console.WriteLine("filter2-action executed!!!");
            base.OnActionExecuted(filterContext);
        }
    }

    public class MyErrorFilter : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            Console.WriteLine("an exception captured!!!");
            base.OnException(filterContext);
        }
    }

现在,Filter2正在捕获HandleErrorAttribute的异常(此过滤器的顺序为-1,btw)

所以,即使你有n个过滤器,如果发生任何异常,那么它会在HandleErrorAttribute级别被捕获:)

注意[2017年11月]:您可以在全球范围内注册此MyErrorFilter,以便 您无需在每个控制器上装饰它 你有。

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