因此,如果我正确理解[HandleError]
(see here),您必须将其添加到您希望处理错误的每个Controller中。
将错误页面的路径添加到web.config customErrors标记中似乎要容易得多:
<customErrors mode="On" defaultRedirect="~/Error/Index" >
</customErrors>
在什么情况下使用[HandleError]比这更好?
答案 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。