Reputation: 23064
So if I understand [HandleError]
correctly (see here) you have to add it to each Controller that you want to have errors handled on.
It seems much easier to just add the path of your error page into the web.config customErrors tag:
<customErrors mode="On" defaultRedirect="~/Error/Index" >
</customErrors>
In what situations would using [HandleError] be better than that?
Upvotes: 2
Views: 1473
Reputation: 4749
Any attribute can applied to all controllers globally in FilterConfig.RegisterGlobalFilters: filters.Add(new HandleErrorAttribute());
Can be done for API controllers too in the relevant method, i.e. WebApiConfig.Register.
However, if you only need to display a simple error page just use customErrors.
Upvotes: 0
Reputation: 3276
In [HandleError]
you can achieve quite a lot. You can log the error. You can also figure out the kind of error and based on situation you can redirect the user to certain page.Following is one sample -
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();
}
}
In this code I am saving exception message to TempData
, so that I can show the error message to user. This is just one example but you can do anything that your requirements demand. Here I am creating my own [HandleError]
attribute by inheriting from FilterAttribute
and implementing IExceptionFilter
. You can see the kind of power I am getting here. I implemented my own attribute to handle my requirements. But you can achieve the similar results by using built in [HandleError]
.
Purpose of line no. 2 is to handle a scenario where somebody else in chain has already handled the exception. Then in that case you might not be interested to handle it again. Response.Clear() is to clear the pipe before I redirect user to new page. It is not necessary to be there in your case.
Upvotes: 2