• Controller级别的异常处理过滤器IExceptionFilter


    1,系统自带的HandleErrorAttribute类继承自IExceptionFilter,是MVC的默认实现。

    同时设置web.config 

    <system.web>
    <customErrors mode="On"/>

    </system.web>

    //只需要简单的将改特性放到controller类头上,告诉MVC如果该Controller中的Action方法出现异常,都交由HandleError特性处理
    [HandleError(ExceptionType = typeof(System.Data.DataException), View = "Error")]
    public class HomeController : Controller{
    /* Controller Actions with HandleError applied to them */
    }

    HandleErrorAttribute类中OnException方法的源代码如下:

    // System.Web.Mvc.HandleErrorAttribute
    public virtual void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }
        if (filterContext.IsChildAction)
        {
            return;
        }
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
        {
            return;
        }
        Exception exception = filterContext.Exception;
        if (new HttpException(null, exception).GetHttpCode() != 500)
        {
            return;
        }
        if (!this.ExceptionType.IsInstanceOfType(exception))
        {
            return;
        }
        string controllerName = (string)filterContext.RouteData.Values["controller"];
        string actionName = (string)filterContext.RouteData.Values["action"];
        HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
        filterContext.Result = new ViewResult
        {
            ViewName = this.View,
            MasterName = this.Master,
            ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
            TempData = filterContext.Controller.TempData
        };
        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = 500;
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }

    2,自定义方式

    方式一:

    可以重写自定义过滤器,重写HandleErrorAttribute类中的OnException方法

    同样设置web.config

    <system.web>
    <customErrors mode="On"/>
    </system.web>

    public class MyHandleErrorAttribute : HandleErrorAttribute 
    {
    public override void OnException(ExceptionContext filterContext) { //自定义 } }

     然后,把自定义过滤器“MyHandleError”放到Controller的头上即可,

    [MyHandleError(ExceptionType = typeof(System.Data.DataException), View = "Error")]
    public class HomeController : Controller{
    /* Controller Actions with HandleError applied to them */
    }

    方式二:

    System.Web.Mvc.Controller类,也继承自IExceptionFilter,但是没有实现OnException方法,因此可以在Controller下重写(实现)OnException方法

    同样设置web.config

    <system.web>
    <customErrors mode="On"/>
    </system.web>

    public class BaseController : Controller
        {
    protected override void OnException(ExceptionContext filterContext)
            {
                base.OnException(filterContext);
    
                // 当自定义显示错误 mode = On,显示友好错误页面
                if (filterContext.HttpContext.IsCustomErrorEnabled)
                {
                    filterContext.ExceptionHandled = true;
                    this.View("Error").ExecuteResult(this.ControllerContext);
                }
            }
        }
  • 相关阅读:
    解析XML(2)
    对Maven项目进行强制更新
    解析xml
    #8:二日合辑——6
    #7:怀念儿时的春节——9
    #6:年兽礼包——6
    #5:你的背包——6
    UVa12298(生成函数的简单应用+FFT)
    #4:初学者之身——5
    #3:调试疯了——3
  • 原文地址:https://www.cnblogs.com/imust2008/p/5262408.html
Copyright © 2020-2023  润新知