How to use Exception filters in MVC 5

一曲冷凌霜 提交于 2019-12-01 03:15:21

You could derive your own HandleErrorAttribute

public class NLogExceptionHandlerAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        // log error to NLog
        base.OnException(filterContext);
    }
}

Then register it globally

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new NLogExceptionHandlerAttribute());
    ...
}

By default, the HandleErrorAttribute will display the Error view located in the ~/Views/Shared folder but if you wanted to display a specific view you can set the View property of the attribute.

I believe it should be this code:

public class MyExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { 
            action = "UserLogOut", 
            controller = "User", 
            area = "User" 
        }));

    }

}

You may add an additional "if (!filterContext.ExceptionHandled)" statement before logging the values inside the result to make sure that the exception's unhandled for the moment.

Exception filters are run only when unhandled exception has been thrown inside an action method. As you asked, here is an example to redirect to another page upon exception:

public class MyExceptionAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if(!filterContext.ExceptionHandled)
        {
            filterContext.Result = new RedirectResult("~/Content/ErrorPage.html");
            filterContext.ExceptionHandled = true;
        }    
    }
}

Now, to apply this filter to either controllers or individual actions, put [MyException] on them.

You may need to check the occurence of an specific Exception inside the if clause. e.g.:

if(... && filterContext.Excaption is ArgumentOutOfRangeException)

To return a View as Exception Response:

filterContext.Result = new RedirectResult("/Home/ErrorAction");

other alternatives you might use to redirect are:

  • new RedirectToRouteResult{ ... }
  • new ViewResult{ ... }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!