在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常

前言

在 ASP.NET Core Web API 中,异常筛选器(Exception Filter)是一种用于处理发生在 Web API 控制器或管道中的异常的机制。

异常筛选器可以捕获和处理应用程序中发生的异常,当系统中出现未经处理的异常的时候,异常筛选器就会执行,我们可以在异常筛选器中对异常进行处理,例如记录日志、返回自定义错误信息等。

需要注意的是,只有 ASP.NET Core 线程中的未处理异常才会被异常筛选器处理。

本文主要通过一个实例来讲述在 ASP.NET Core Web API 中如何使用异常筛选器。

Step By Step 步骤

  1. 创建一个ASP.NET Core webapi 项目

  2. 编写自定义的异常筛选器 MyExceptionFilter,实现 IAsyncExceptionFilter 接口(注意其中的注释)

    c# 复制代码
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Filters;
    
    public class MyExceptionFilter : IAsyncExceptionFilter
    {
    	private readonly ILogger<MyExceptionFilter> logger;
    	private readonly IHostEnvironment env;
    
    	// 注入 ILogger 和 IHostEnvironment
    	// IHostEnvironment 用于判断环境类型
    	public MyExceptionFilter(
    		ILogger<MyExceptionFilter> logger,
    		IHostEnvironment env)
    	{
    		this.logger = logger;
    		this.env = env;
    	}
    
    	public Task OnExceptionAsync(ExceptionContext context)
    	{
    		Exception exception = context.Exception;
    		logger.LogError(exception, "UnhandledException occured");
    		string message;
    		if (env.IsDevelopment())
    		{
    			// 如果是开发环境,打印所有的异常堆栈信息
    			message = exception.ToString();
    		}
    		else
    		{
    			// 否则只打印简单信息
    			message = "程序中出现未处理异常";
    		}
    
    		// 设置响应报文的内容
    		ObjectResult result = new ObjectResult(new { code = 500, message = message });
    		result.StatusCode = 500;
    		context.Result = result;
    
    		// 设置context.ExceptionHandled的值为true,让ASP.NET Core不再执行默认的异常响应逻辑
    		context.ExceptionHandled = true;
    		return Task.CompletedTask;
    	}
    }
  3. 打开 Program.cs,设置全局的筛选器(注意其中的注释)

    c# 复制代码
    using Microsoft.AspNetCore.Mvc;
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    
    builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();
    
    // 注册自定义异常过滤器服务
    // MvcOptions是ASP.NET Core项目的主要配置对象
    // 用于向Filters注册全局的筛选器
    builder.Services.Configure<MvcOptions>(opt => { 
    	opt.Filters.Add<MyExceptionFilter>();
    });
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
    	app.UseSwagger();
    	app.UseSwaggerUI();
    }
    
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();
  4. 打开控制器,模拟错误进行测试

    c# 复制代码
    using Microsoft.AspNetCore.Mvc;
    
    namespace 异常筛选器.Controllers
    {
    	[ApiController]
    	[Route("[controller]")]
    	public class WeatherForecastController : ControllerBase
    	{
    		private readonly ILogger<WeatherForecastController> _logger;
    
    		public WeatherForecastController(ILogger<WeatherForecastController> logger)
    		{
    			_logger = logger;
    		}
    
    		[HttpGet(Name = "GetWeatherForecast")]
    		public string Get()
    		{
    			throw new Exception("xxx");
    		}
    	}
    }
相关推荐
lazy H19 分钟前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
波力海苔夹心脆67538 分钟前
VisionMaster 两级位置修正实战:塑料外壳与金属件装配角度检测
经验分享·计算机视觉·c#·visionmaster·海康机器人·位置修正
上海广测检测科技有限公司2 小时前
无线鼠标出口欧盟CE认证准备要点:RED指令下的射频、安全与电池义务梳理
经验分享·安全
小羊没烦恼!2 小时前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
芯片智造3 小时前
镀液中Fe³⁺积累会造成什么后果?
经验分享
淡海水3 小时前
05-02-源码-Boehm GC标记阶段
算法·unity·c#·游戏引擎·gc
信可维4 小时前
AI 读 Word 表格总读错?先查合并单元格和表头这 3 处
开发语言·人工智能·c#·word·软件工程
moongoblin6 小时前
《搭建小智AI对话盒子》系列之一:MacOS下ESP-IDF环境搭建,子模块补齐破局
经验分享·智能硬件
半摆烂日常6 小时前
手机表单的左滑操作:触摸事件的处理细节
大数据·开发语言·人工智能·智能手机·https·c#
HRTOS6 小时前
HRTOS 4.0 本轮测试与升级工作阶段性总结
经验分享·单片机·嵌入式硬件·51单片机