为什么在MVC4网站中使用ExceptionHandled = true调用自定义HandleError属性?

时间:2014-01-11 18:47:51

标签: c# asp.net asp.net-mvc

在MVC4网站中,注册了以下自定义HandleError属性

public class JHSHandleErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
        {
            return;
        }

       //Handler for non-500 errors
        if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
        {
            return;
        }
     ...
在像这样的Global.asax中

protected static void RegisterMVCGlobalFilters(GlobalFilterCollection filters)
{
  //Add HandleError attribute as default for all controller exceptions
  filters.Add(new JHS.Web.Mvc.JHSHandleErrorAttribute
    {
      View = "Error/general"
    }, 1);

  filters.Add(new HandleErrorAttribute(), 2);

}

发生异常时调用自定义HandleError属性,filterContext.ExceptionHandled=true导致显示标准错误页面。

但是,如果将自定义HandleError属性添加到这样的单个操作,则会执行filterContext.Exceptionhandled=false和方法的其余部分,从而导致显示自定义错误视图。

[JHS.Web.Mvc.JHSHandleError(View="Error/general")]
public ActionResult Index()
{

  throw new ArgumentNullException("test");
...

为什么`filterContext.ExceptionHandled = true在自定义错误属性在全局级别注册时显示自定义视图?

1 个答案:

答案 0 :(得分:2)

过滤器执行的顺序描述为herehere。 这仍然代表MVC 4。

基本上在全局级别(HandleErrorAttribute)注册的过滤器会在操作级别上定义的自定义过滤器之前执行。

这可能看起来很奇怪 - 但就是这样。