How to use Exception filters in MVC 5

前端 未结 4 781
没有蜡笔的小新
没有蜡笔的小新 2021-01-04 08:57

How i can implement Exception Filters in MVC5.

I want to throw the exception to NLog and redirect the page to a default error page which displays \"Something is gone

相关标签:
4条回答
  • 2021-01-04 09:06

    Below worked for me. A few things to note 1) RedirectResult points to a controller action, not a view 2) you need to set filterContext.ExceptionHandled = true; or your exception view / page will not display.

    public class ErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            Log.Logger.Error(filterContext.Exception, "An Unhandled exeption occured durring the execution of a request");
    
            filterContext.Result = new RedirectResult("~/MyControler/MyErrorAction");
            filterContext.ExceptionHandled = true;
        }
    
    }
    

    Ofcourse you will also need to register the Error attribute using the GlobalFilters object from your Global.asax as shown below.

     protected void Application_Start()
     {
         GlobalFilters.Filters.Add(new ErrorAttribute());           
         ...
     }
    
    0 讨论(0)
  • 2021-01-04 09:13

    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{ ... }
    0 讨论(0)
  • 2021-01-04 09:14

    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.

    0 讨论(0)
  • 2021-01-04 09:14

    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.

    0 讨论(0)
提交回复
热议问题