MVC HandleError vs customErrors标记

时间:2010-10-06 15:41:20

标签: asp.net-mvc error-handling

因此,如果我正确理解[HandleError] (see here),您必须将其添加到您希望处理错误的每个Controller中。

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

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

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

2 个答案:

答案 0 :(得分:2)

[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,以便我可以向用户显示错误消息。这只是一个例子,但您可以做任何您的要求所需的事情。在这里,我通过继承[HandleError]并实施FilterAttribute来创建自己的IExceptionFilter属性。你可以看到我在这里获得的力量。我实现了自己的属性来处理我的要求。但是,您可以使用内置[HandleError]

来获得类似的结果

行号的目的2是处理链中的其他人已经处理了异常的情况。那么在那种情况下你可能没兴趣再次处理它。 Response.Clear()是在我将用户重定向到新页面之前清除管道。在你的情况下没有必要在那里。

答案 1 :(得分:0)

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

也可以在相关方法中为API控制器完成,即WebApiConfig.Register。

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