文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ASP.NETMVC自定义异常过滤器

2024-04-02 19:55

关注

一、异常过滤器

异常筛选器用于实现IExceptionFilter接口,并在ASP.NET MVC管道执行期间引发了未处理的异常时执行。异常筛选器可用于执行诸如日志记录或显示错误页之类的任务。HandleErrorAttribute类是异常筛选器的一个示例。

先来看看HandleErrorAttribute类的定义:

#region 程序集 System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// D:\Practice\MVC\自定义异常过滤器\MVCCuetomerExcepFilter\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll
#endregion

namespace System.Web.Mvc
{
    //
    // 摘要:
    //     表示一个特性,该特性用于处理由操作方法引发的异常。
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class HandleErrorAttribute : FilterAttribute, IExceptionFilter
    {
        //
        // 摘要:
        //     初始化 System.Web.Mvc.HandleErrorAttribute 类的新实例。
        public HandleErrorAttribute();

        //
        // 摘要:
        //     获取或设置异常的类型。
        //
        // 返回结果:
        //     异常的类型。
        public Type ExceptionType { get; set; }
        //
        // 摘要:
        //     获取或设置用于显示异常信息的母版视图。
        //
        // 返回结果:
        //     母版视图。
        public string Master { get; set; }
        //
        // 摘要:
        //     获取此特性的唯一标识符。
        //
        // 返回结果:
        //     此特性的唯一标识符。
        public override object TypeId { get; }
        //
        // 摘要:
        //     获取或设置用于显示异常信息的页视图。
        //
        // 返回结果:
        //     页视图。
        public string View { get; set; }

        //
        // 摘要:
        //     在发生异常时调用。
        //
        // 参数:
        //   filterContext:
        //     操作筛选器上下文。
        //
        // 异常:
        //   T:System.ArgumentNullException:
        //     filterContext 参数为 null。
        public virtual void OnException(ExceptionContext filterContext);
    }
}

从代码中可以看出HandleErrorAttribute继承了IExceptionFilter接口,并且有一个虚方法,如果要自定义异常过滤器,只需要继承HandleErrorAttribute类并重写HandleErrorAttribute类里面的虚方法即可。

二、示例

1、创建异常类

新建一个ExceptionFilters类继承自HandleErrorAttribute,并重写OnException方法,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCCuetomerExcepFilter.Extension
{
    /// <summary>
    /// 异常过滤器
    /// </summary>
    public class ExceptionFilters : HandleErrorAttribute
    {
        /// <summary>
        /// 在异常发生时调用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnException(ExceptionContext filterContext)
        {
            // 判断是否已经处理过异常
            if(!filterContext.ExceptionHandled)
            {
                // 获取出现异常的controller和action名称,用于记录
                string strControllerName = filterContext.RouteData.Values["controller"].ToString();
                string strActionName = filterContext.RouteData.Values["action"].ToString();
                // 定义一个HandleErrorInfo,用于Error视图展示异常信息
                HandleErrorInfo info = new HandleErrorInfo(filterContext.Exception, strControllerName, strActionName);

                ViewResult result = new ViewResult
                {
                    ViewName = this.View,
                    // 定义ViewData,泛型
                    ViewData = new ViewDataDictionary<HandleErrorInfo>(info)
                };
                // 设置操作结果
                filterContext.Result = result;
                // 设置已经处理过异常
                filterContext.ExceptionHandled = true;
            }
            //base.OnException(filterContext);
        }
    }
}

2、创建控制器

新建一个控制器,代码如下:

using MVCCuetomerExcepFilter.Extension;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCCuetomerExcepFilter.Controllers
{
    public class ExceptionController : Controller
    {
        // GET: Exception
        /// <summary>
        /// View表示发生异常时指定的视图
        /// 这里表示发生异常时使用ExceptionDetails视图
        /// </summary>
        /// <returns></returns>
        [ExceptionFilters(View =("ExceptionDetails"))]
        public ActionResult Index()
        {
            // 测试抛出异常
            throw new NullReferenceException("测试抛出的异常");
        }
    }
}

异常发生时使用ExceptionDetails视图,所以在Shared文件夹里面新建ExceptionDetails视图,代码如下:

<!--使用强类型视图-->
@model System.Web.Mvc.HandleErrorInfo
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>异常</title>
</head>
<body>
    <p>
        抛错控制器:<b>@Model.ControllerName</b> 抛错方法:<b>@Model.ActionName</b> 抛错类型:<b>
            @Model.Exception.GetType().Name
    </b>
</p>
<p>
    异常信息:<b>@Model.Exception.Message</b>
</p>
<p>
    堆栈信息:
</p>
<pre>@Model.Exception.StackTrace</pre>
</body>
</html>

三、测试

运行程序,访问Exception控制器的Index方法,效果如下:

四、总结

上面的案例演示了一个自定义异常类,很明显比HandleError要灵活,在自定义异常类里面可以写很多与业务相关的代码。

GitHub代码地址:https://github.com/jxl1024/CustomerHandleErrorFilter

到此这篇关于ASP.NET MVC自定义异常过滤器的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯