异常过滤器—MVC中异常过滤器使用

异常,过滤器,mvc,使用 · 浏览次数 : 94

小编点评

**异常过滤器** 是 ASP.NET Core 中用于处理全局异常的机制。它们允许你在发生异常时捕获、处理和记录异常,并提供自定义的异常处理逻辑。 **实现异常过滤器** 的步骤如下: 1. **接口实现**:接口 `IExceptionFilter` 或 `IAsyncExceptionFilter` 用于处理异常。 2. **`OnException` 方法**:该方法在异常发生时执行,并提供异常的信息。 3. **返回结果**:当异常处理完成后,应返回一个响应,例如一个 HTML 页面。 **在全局过滤器中添加异常过滤器**: 1. 使用 `services.AddMvc` 添加 `ExceptionFilter` 过滤器。 2. 在 `app.Configure` 中注册管道。 **在访问调用中验证异常过滤器**: 1. 使用 `[ExceptionFilter]` 标记控制器或 Action 方法。 2. 在 `OnException` 方法中,您可以捕获异常并将其处理。 **示例**: ```csharp // ExceptionFilter 接口 public interface IExceptionFilter { void OnException(ExceptionContext context); } // ExceptionFilter 实现类 public class ExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { // 写入异常信息到日志 Console.WriteLine("错误信息:" + context.Exception.Message); } } //控制器 [Route("api/[controller]")] [ApiController] public class ExceptionFilterController : ControllerBase { [HttpGet] public ActionResult Test() { throw new Exception("Oh,My God,A Exception Occurred......"); } } ``` **运行程序**: 访问 `localhost:5001/ExceptionFilter/Test` 地址,您将看到以下异常信息: ``` 错误信息:Oh,My God,A Exception Occurred...... ```

正文

一、什么是异常过滤器?

异常过滤器(Exception Filters)是 ASP.NET Core 中用于处理全局异常的机制。它们允许你在发生异常时捕获、处理和记录异常,并提供自定义的异常处理逻辑。异常过滤器在整个应用程序范围内生效,可以用于处理各种异常情况。用于实现常见的错误处理策略,没有之前和之后事件,处理 Razor 页面或控制器创建、模型绑定、操作过滤器或操作方法中发生的未经处理的异常。但无法捕获资源过滤器、结果过滤器或 MVC 结果执行中发生的异常 。
image

二、异常过滤器实现

异常过滤器定义:

异常过滤器的定义,需要实现接口IExceptionFilter 或者IAsyncExceptionFilter,该接口包含一个 OnException 方法或者OnExceptionAsync方,用于处理发生的异常,继承后重写此方法。

#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 创建者:码农阿亮
 * 创建时间:2023/8/15 14:02:01
 * 版本:V1.0.0
 * 描述:
 *
 * ----------------------------------------------------------------
 * 修改人:
 * 时间:
 * 修改说明:
 *
 * 版本:V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;

namespace MyWebApp.Filter
{
    /// <summary>
    /// 异常过滤器
    /// </summary>
    public class ExceptionFilter : Attribute, IExceptionFilter
    {
        /// <summary>
        /// 没有之前和之后事件,当程序发生没有捕获的异常时候执行
        /// </summary>
        /// <param name="context"></param>
        public void OnException(ExceptionContext context)
        {
            //异常信息
            var ex = context.Exception;
            //这里可以写入异常日志到数据库、文件或者控制台
            Console.WriteLine("错误信息:"+ex.Message);

            /*
             * 方便测试,此处将错误日志信息返回
             */
            context.Result = new ContentResult()
            {
                Content = ex.Message,
                ContentType = "text/html"
            };

        }
    }
}

添加到全局过滤器:

    services.AddMvc(options =>
        {
            //异常过滤器
           options.Filters.Add<ExceptionFilter>();
        });

添加测试Action:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;

namespace MyWebApp.Controllers
{
   [Route("api/[controller]")]
   [ApiController]
   public class ExceptionFilterController : ControllerBase
   {

       /// <summary>
       /// 测试:手动抛出一个未捕获异常
       /// </summary>
       /// <returns></returns>
       [HttpGet]
       public ActionResult Test()
       {
           throw new Exception("Oh,My God,A Exception Occurred......");
       }
   }
}

三、验证:

接口Action访问调用:

访问地址:

https://localhost:5001/ExceptionFilter/Test

控制台输出异常信息:
image

调用接口时异常过滤器返回异常:
image

与异常过滤器—MVC中异常过滤器使用相似的内容:

异常过滤器—MVC中异常过滤器使用

## 一、什么是异常过滤器? 异常过滤器(**Exception Filters**)是 ASP.NET Core 中用于处理全局异常的机制。它们允许你在发生异常时捕获、处理和记录异常,并提供自定义的异常处理逻辑。异常过滤器在整个应用程序范围内生效,可以用于处理各种异常情况。用于实现常见的错误处理策

5.使用日志+自定义全局异常过滤器

刚开始写文章,封装Base基类的时候,添加了trycatch异常块,不过当时没有去记录日志,直接return了。有小伙伴劝我不要吃了Exception 其实没有啦,项目刚开始,我觉得先做好整体结构比较好。像是盖楼一样。先把楼体建造出来,然后再一步一步的美化完善。 基础的仓储模式已经ok,Autofa

nestjs入门学习总结(二):中间件、异常过滤器、守卫、管道、拦截器

### 中间件 Nest 中间件可以是一个函数,也可以是一个带有 @Injectable() 装饰器的类,且该类应该实现 NestMiddleware 接口,而函数没有任何特殊要求。 如下是一个日志中间件的简单示例: ``` import { Injectable, NestMiddleware }

【numpy基础】--数组过滤

在`numpy`中,数组可以看作是一系列数值的有序集合,可以通过下标访问其中的元素。处理数组的过程中,经常需要用到数组过滤功能。 过滤功能可以在处理数据时非常有用,因为它可以使数据更加干净和可读性更强。例如,在进行数据分析时,通常需要去除异常值,过滤掉不必要的元素可以使数据更加易于分析和处理。 `n

8个实用的Java Streams API

分享8个开箱即用的API,方便日常处理集合。 1. 快速过滤空值:Stream.ofNullable 该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而可能使我们避免空指针异常。 在下面的示例中,有一个包含 null 的List。此时,我们可以使用Stream.ofNullable

Harbor简单搭建以及异常排查的过程与思路

Harbor简单搭建以及异常排查的过程与思路 前言 我发现我总是能够遇到别人遇不到的问题. 本来搭建十分钟就可以搭建完成 结果我硬生生的搭建了四十分钟. 为了保证下次不再浪费时间. 这里加单总结一下遇到的问题 系统准备 这次使用的是UOS V20 1050E x86的操作系统. 简单起见: yum

如何从消失的异常堆栈定位线上问题

在618保障大促稳定性过程中,消失的异常堆栈可能会给我们带来严重的麻烦,因为这些堆栈信息是我们解决线上问题的关键之一。如何快速定位问题?想必大家心中都有自己的答案,当然最简单直接的办法还是查找异常堆栈信息。

异常:no transaction is in progress

转载请注明出处: 在使用 @Scheduled 注解创建了一个定时任务,并通过定时任务不断向mysql写入数据,写入数据的方式是通过 jpa 的方式,在代码运行的过程中出现错误:no transaction is in progress。 以下是异常堆栈: 原因分析: 该异常表明没有事务正在进行,导

研发提速:nacos+openfeign环境下的本地链接服务

项目研发过程中,经常会遇到与测试人员工作重叠的情况,十分影响效率。 做了一个修改,可以在本地环境启动项目后和测试环境交互,并且不影响测试环境,理论上也可以用于线上环境的异常的快速处理。 准备事项如下: 一:搭建本地的nacos服务。 二:导入测试环境相应项目的nacos配置文件。 三:新增代码: 修

[转帖]记一次靠谱的 K8S 排错实战过程,硬核!

http://blog.itpub.net/31545813/viewspace-2925035/ 一 背景 收到测试环境集群告警,登陆 K8s 集群进行排查。 二 故障定位 2.1 查看 Pod 查看 kube-system node2 节点 calico pod 异常。 查看详细信息,查看nod