Asp.net mvc MVC HandleError vs customErrors标签

Asp.net mvc MVC HandleError vs customErrors标签,asp.net-mvc,error-handling,Asp.net Mvc,Error Handling,因此,如果我正确理解了[HandleError],您必须将其添加到您希望处理错误的每个控制器中 只需将错误页面的路径添加到web.config customErrors标记中似乎就容易多了: <customErrors mode="On" defaultRedirect="~/Error/Index" > </customErrors> 在什么情况下使用[HandleError]会比这更好?在[HandleError]中,您可以实现很多。您可以记录错误。您还可以找出

因此,如果我正确理解了
[HandleError]
,您必须将其添加到您希望处理错误的每个控制器中

只需将错误页面的路径添加到web.config customErrors标记中似乎就容易多了:

<customErrors mode="On" defaultRedirect="~/Error/Index" >
</customErrors>


在什么情况下使用[HandleError]会比这更好?

[HandleError]
中,您可以实现很多。您可以记录错误。您还可以找出错误的类型,并根据情况将用户重定向到特定页面。以下是一个示例-

public class HandleErrorAttribute : FilterAttribute, IExceptionFilter
{
   public void OnException(ExceptionContext filterContext)
     {
           if (filterContext.ExceptionHandled)
                return;

            string referrerController = string.Empty;
            string referrerAction = string.Empty;

            if (filterContext.HttpContext.Request.UrlReferrer != null)
            {
                string[] segments = filterContext.HttpContext.Request.UrlReferrer.Segments;


                if (segments.Length > 1)
                {
                    referrerController = segments[1] != null ? segments[1].Replace("/", string.Empty) : string.Empty;
                }

                if (segments.Length > 2)
                {
                    referrerAction = segments[2] != null ? segments[2].Replace("/", string.Empty) : string.Empty;
                }
            }


            filterContext.Controller.TempData["exception"] = filterContext.Exception.Message;

            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(
                new { controller = referrerController , action = referrerAction}));

            filterContext.ExceptionHandled = true;

            filterContext.HttpContext.Response.Clear();


    }
}
在此代码中,我将异常消息保存到
TempData
,以便向用户显示错误消息。这只是一个例子,但您可以根据需求做任何事情。在这里,我通过继承
filteratAttribute
并实现
IEExceptionFilter
来创建自己的
[HandleError]
属性。你可以看到我在这里获得的力量。我实现了自己的属性来处理我的需求。但使用内置的
[HandleError]
也可以获得类似的结果


第2行的目的是处理一个场景,其中链中的其他人已经处理了异常。那么在这种情况下,你可能不会有兴趣再次处理它。Response.Clear()用于在将用户重定向到新页面之前清除管道。在您的情况下,不需要在那里。

任何属性都可以全局应用于FilterConfig.RegisterGlobalFilters中的所有控制器: filters.Add(新HandleErrorAttribute())

也可以通过相关方法(即WebApiConfig.Register)对API控制器执行此操作


但是,如果您只需要显示一个简单的错误页面,只需使用customErrors即可。

控制器中的代码在哪里?当第2行有一个空白的
返回时会发生什么?为什么要使用Response.Clear()?另外,如果要将[HandleError]属性应用于应用程序中的所有控制器,可以创建一个基本控制器,将[HandleError]属性应用于它,然后它们从基本控制器而不是默认控制器派生出所有控制器Hanks Gnomo,这应该是一个答案,而不是评论