翼度科技»论坛 编程开发 .net 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27

前言

在 ASP.NET Core Web API 中,异常筛选器(Exception Filter)是一种用于处理发生在 Web API 控制器或管道中的异常的机制。
异常筛选器可以捕获和处理应用程序中发生的异常,当系统中出现未经处理的异常的时候,异常筛选器就会执行,我们可以在异常筛选器中对异常进行处理,例如记录日志、返回自定义错误信息等。
需要注意的是,只有 ASP.NET Core 线程中的未处理异常才会被异常筛选器处理。
本文主要通过一个实例来讲述在 ASP.NET Core Web API 中如何使用异常筛选器。
Step By Step 步骤


  • 创建一个ASP.NET Core webapi 项目
  • 编写自定义的异常筛选器 MyExceptionFilter,实现 IAsyncExceptionFilter 接口(注意其中的注释
    1. using Microsoft.AspNetCore.Mvc;
    2. using Microsoft.AspNetCore.Mvc.Filters;
    3. public class MyExceptionFilter : IAsyncExceptionFilter
    4. {
    5.         private readonly ILogger<MyExceptionFilter> logger;
    6.         private readonly IHostEnvironment env;
    7.         // 注入 ILogger 和 IHostEnvironment
    8.         // IHostEnvironment 用于判断环境类型
    9.         public MyExceptionFilter(
    10.                 ILogger<MyExceptionFilter> logger,
    11.                 IHostEnvironment env)
    12.         {
    13.                 this.logger = logger;
    14.                 this.env = env;
    15.         }
    16.         public Task OnExceptionAsync(ExceptionContext context)
    17.         {
    18.                 Exception exception = context.Exception;
    19.                 logger.LogError(exception, "UnhandledException occured");
    20.                 string message;
    21.                 if (env.IsDevelopment())
    22.                 {
    23.                         // 如果是开发环境,打印所有的异常堆栈信息
    24.                         message = exception.ToString();
    25.                 }
    26.                 else
    27.                 {
    28.                         // 否则只打印简单信息
    29.                         message = "程序中出现未处理异常";
    30.                 }
    31.                 // 设置响应报文的内容
    32.                 ObjectResult result = new ObjectResult(new { code = 500, message = message });
    33.                 result.StatusCode = 500;
    34.                 context.Result = result;
    35.                 // 设置context.ExceptionHandled的值为true,让ASP.NET Core不再执行默认的异常响应逻辑
    36.                 context.ExceptionHandled = true;
    37.                 return Task.CompletedTask;
    38.         }
    39. }
    复制代码
  • 打开 Program.cs,设置全局的筛选器(注意其中的注释
    1. using Microsoft.AspNetCore.Mvc;
    2. var builder = WebApplication.CreateBuilder(args);
    3. // Add services to the container.
    4. builder.Services.AddControllers();
    5. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    6. builder.Services.AddEndpointsApiExplorer();
    7. builder.Services.AddSwaggerGen();
    8. // 注册自定义异常过滤器服务
    9. // MvcOptions是ASP.NET Core项目的主要配置对象
    10. // 用于向Filters注册全局的筛选器
    11. builder.Services.Configure<MvcOptions>(opt => {
    12.         opt.Filters.Add<MyExceptionFilter>();
    13. });
    14. var app = builder.Build();
    15. // Configure the HTTP request pipeline.
    16. if (app.Environment.IsDevelopment())
    17. {
    18.         app.UseSwagger();
    19.         app.UseSwaggerUI();
    20. }
    21. app.UseHttpsRedirection();
    22. app.UseAuthorization();
    23. app.MapControllers();
    24. app.Run();
    复制代码
  • 打开控制器,模拟错误进行测试
    1. using Microsoft.AspNetCore.Mvc;
    2. namespace 异常筛选器.Controllers
    3. {
    4.         [ApiController]
    5.         [Route("[controller]")]
    6.         public class WeatherForecastController : ControllerBase
    7.         {
    8.                 private readonly ILogger<WeatherForecastController> _logger;
    9.                 public WeatherForecastController(ILogger<WeatherForecastController> logger)
    10.                 {
    11.                         _logger = logger;
    12.                 }
    13.                 [HttpGet(Name = "GetWeatherForecast")]
    14.                 public string Get()
    15.                 {
    16.                         throw new Exception("xxx");
    17.                 }
    18.         }
    19. }
    复制代码
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),和你共同探索代码世界的奥秘!


来源:https://www.cnblogs.com/JackyGz/p/18422993
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具