在网页遇到控制器操作之前,我有各种过滤器。
很少有过滤器具有复杂的逻辑,可能会抛出异常。
现在,我如何捕捉这些例外?
例如。我有一个过滤器来处理控制器方法中发生的异常。
[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
到每个过滤器。
在这种情况下,如何进行单一位置错误处理,可以处理所有这些过滤器中发生的异常?
答案 0 :(得分:2)
阅读这篇文章。你会找到答案 http://www.codeproject.com/Articles/850062/Exception-handling-in-ASP-NET-MVC-methods-explaine
答案 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());
}
}