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

本文关键字:异常 过滤器 何处理 处理 | 更新日期: 2023-09-27 18:04:56

在URL到达控制器动作之前,我有各种过滤器。

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

现在,我如何捕获这些异常?

例如

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

[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到每个过滤器

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

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

阅读本文。你会找到答案的http://www.codeproject.com/Articles/850062/Exception-handling-in-ASP-NET-MVC-methods-explaine

加上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 Nov]:您可以在全局级别注册此MyErrorFilter,因此您不需要在您拥有的每个控制器上装饰它。

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