返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NETMVC自定义异常过滤器
  • 598
分享到

ASP.NETMVC自定义异常过滤器

2024-04-02 19:04:59 598人浏览 薄情痞子
摘要

一、异常过滤器 异常筛选器用于实现IExceptionFilter接口,并在asp.net mvc管道执行期间引发了未处理的异常时执行。异常筛选器可用于执行诸如日志记录或显示错误页之

一、异常过滤器

异常筛选器用于实现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自定义异常过滤器的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: ASP.NETMVC自定义异常过滤器

本文链接: https://lsjlt.com/news/142647.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ASP.NETMVC自定义异常过滤器
    一、异常过滤器 异常筛选器用于实现IExceptionFilter接口,并在ASP.NET MVC管道执行期间引发了未处理的异常时执行。异常筛选器可用于执行诸如日志记录或显示错误页之...
    99+
    2024-04-02
  • ASP.NETMVC自定义授权过滤器
    目录一、授权过滤器二、示例1、添加对应实体类2、添加测试数据3、新建继承类4、添加Account控制器5、修改配置文件6、添加授权控制器三、测试测试Welcome四、总结一、授权过滤...
    99+
    2024-04-02
  • ASP.NETMVC异常过滤器用法
    我们平常在程序里面为了捕获异常,会加上try-catch-finally代码,但是这样会使得程序代码看起来很庞大,在MVC中我们可以使用异常过滤器来捕获程序中的异常,如下图所示: ...
    99+
    2024-04-02
  • ASP.NET MVC自定义异常过滤器使用案例
    目录一、需求二、案例1、创建工具类1.1、创建日志工具类1.2、创建网络工具类2、创建自定义异常类3、创建控制器4、测试在上一篇文章中讲解了自定义异常过滤器,这篇文章会结合工作中的真...
    99+
    2024-04-02
  • .NET6自定义WebAPI过滤器
    1、上代码 /// <summary> /// API白名单过滤器 /// </summary> public class API...
    99+
    2024-04-02
  • vue如何自定义过滤器
    在vue中自定义过滤器的方法:1.新建vue.js项目;2.使用Vue.filter()方法自定义过滤器;具体步骤如下:首先,在vue-cli中创建一个vue.js项目;vue create project-namevue.js项目创建好后...
    99+
    2024-04-02
  • django怎么自定义过滤器
    在Django中,可以通过创建自定义过滤器来对模板中的变量进行特定的处理。可以按照以下步骤来自定义过滤器: 创建一个Python...
    99+
    2023-10-25
    django
  • ASP.NETMVC缓存过滤器用法
    缓存过滤器用来输出页面缓存,其用法如下图所示: 注意: Duration:表示缓存多少秒;VaryByParam:表示缓存是否随地址参数而改变。OutputCache除了可以定义在...
    99+
    2024-04-02
  • ASP.NET MVC自定义操作过滤器
    目录一、操作过滤器1、定义2、案例2.1、创建自定义操作过滤器2.2、新建控制器二、结果过滤器1、定义2、案例三、案例1、记录操作1.1、创建实体类1.2、创建日志类1.3、修改操作...
    99+
    2024-04-02
  • springboot自定义过滤器的方法
    过滤器是Servlet的规范,是基于函数回调的,需要实现javax.servlet.Filter接口,依赖于Tomcat等容器,一般用于过滤请求的URL。 1自定义过滤器 自定义fi...
    99+
    2024-04-02
  • python自定义异常
    python自定义异常try             异常在try块里抛,如果会产生多个异常,捕捉第一个,匹配except,后边的不再捕捉except: 抓异常else:       try无异常,才会执行elsefinally:   无论...
    99+
    2023-01-31
    自定义 异常 python
  • springSecurity之如何添加自定义过滤器
    目录springSecurity 添加自定义过滤器很简单,配置如下然后再来看看myFilterspringSecurity 自定义认证过滤器出现的问题解决方法springSecuri...
    99+
    2024-04-02
  • Spring Cloud Zuul自定义过滤器的实现
    构建Zuul自定义过滤器,限制ip频繁请求 自定义zuul过滤器其实很简单 1. 首先pom文件得先引入zuul依赖 <dependency> <gr...
    99+
    2024-04-02
  • Django自定义模板标签和过滤器
    1.创建模板库 在某个APP所在目录下新建包templatetags,然后在其中创建存储标签或者过滤器的的模块,名称随意,例如myfilters.py。 在这个模块中编写相关代码。 注意:templatetags所在APP应该在配置文件中...
    99+
    2023-01-31
    自定义 过滤器 模板
  • Vue过滤器怎么自定义及使用
    这篇文章主要介绍“Vue过滤器怎么自定义及使用”,在日常操作中,相信很多人在Vue过滤器怎么自定义及使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue过滤器怎么自定义及使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-04
  • C#中如何使用异常过滤器处理特定异常
    C#中如何使用异常过滤器处理特定异常异常处理是开发过程中不可或缺的一部分。当程序出现异常时,能够准确定位并处理异常,是保证程序稳定性和可靠性的重要环节之一。C#提供了异常过滤器(Exception Filter)的机制,可以根据需求选择性地...
    99+
    2023-10-22
    C# 特定异常处理 异常过滤器
  • ASP.NETMVC过滤器执行顺序介绍
    如果某个Action过滤器运用了多种过滤器,那么过滤器的执行顺序是如何呢? 规则一:不同类型的过滤器有一个先后顺序 即执行顺序是:授权过滤器->动作过滤器->结果过滤器...
    99+
    2024-04-02
  • springboot整合shiro与自定义过滤器的全过程
    目录filter自定义过滤器  增加了 对验证码的校验Shiro中的权限控制总结filter自定义过滤器  增加了 对验证码的校验 package com.you...
    99+
    2024-04-02
  • vue 过滤器和自定义指令的使用
    目录过滤器 01. 是什么 02. 怎么做 (1)定义过滤器 (2)使用方式 (3)过滤器的参数03. 封装过滤器函数 自定义指令 01. 是什么 02. 基本概念 (1)钩子函数 ...
    99+
    2024-04-02
  • Spring Cloud Zuul如何实现自定义过滤器
    小编给大家分享一下Spring Cloud Zuul如何实现自定义过滤器,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!构建Zuul自定义过滤器,限制ip频繁请求自定义zuul过滤器其实很简单1. 首先pom文件得先引入zu...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作