MasaFramework -- 异常处理

前言在程序设计中,我们会遇到各种各样的异常问题,一个异常处理不仅仅可以帮助开发者快速的定位问题,也可以给用户更好的使用体验 , 那么我们在AspNetCore项目中如何捕获以及处理异常呢?
而对应AspNetCore程序 , 我们有两种异常处理方案 , 它们分别是:

  • 异常中间件
  • 异常过滤器
介绍Masa Franework作为一个框架 , 它为开发者以及用户提供更好的开发体验和使用体验的异常处理功能
Masa.Utils.Exceptions 中定义了两种异常类
  • UserFriendlyException(友好异常)
  • MasaException(框架异常)
【MasaFramework -- 异常处理】并提供了两种异常处理方案,那接下来就让我们看看它们是如何使用的
  • 异常中间件
  • 异常过滤器
根据需要自行选择一种方案使用即可
快速入门项目基于.NET 6.0创建,必须安装所必须的环境
  • 安装.NET 6.0
异常中间件基于中间件实现的全局异常处理,用于捕捉应用程序异常,并将异常信息处理后返回
  1. 新建ASP.NET Core 空项目Assignment.GlobalExceptionDemo,并安装Masa.Utils.Exceptions
dotnet new web -o Assignment.GlobalExceptionDemocd Assignment.GlobalExceptionDemodotnet add package Masa.Utils.Exceptions --version 0.6.0-rc.3 //提供全局异常过滤器
  1. 新建用户类User
public class User{public string Name { get; set; }public int Age { get; set; }}
  1. 使用全局异常,修改Program
//支持处理自定义异常app.UseMasaExceptionHandler(options =>{//支持处理自定义异常options.ExceptionHandler = context =>{if (context.Exception is ArgumentNullException ex){context.ToResult($"{ex.ParamName}不能为空");}};});
  1. 新增注册用户方法(用于自定义抛出异常)
app.MapPost("/register", (User user) =>{if (string.IsNullOrEmpty(user.Name))throw new ArgumentNullException(nameof(user.Name));//todo: Impersonate a registered user});
更多使用技巧可查看
异常过滤器基于MVC的全局异常过滤器,用于捕捉应用程序异常,并将异常信息处理后返回
  1. 新建ASP.NET Core 空项目Assignment.GlobalFilterDemo,并安装Masa.Utils.Exceptions
dotnet new web -o Assignment.GlobalFilterDemocd Assignment.GlobalFilterDemodotnet add package Masa.Utils.Exceptions --version 0.6.0-rc.3 //提供全局异常过滤器
  1. 新建用户类User
public class User{public string Name { get; set; }public int Age { get; set; }}
  1. 使用全局异常过滤器,修改Program
builder.Services.AddMvc()//使用MasaException.AddMasaExceptionHandler(options =>{options.ExceptionHandler = context =>{if (context.Exception is ValidationException ex){string message = ex.Errors.Select(error => error.ErrorMessage).FirstOrDefault()!;context.ToResult(message);}};});
  1. 新增注册用户方法,用于自定义抛出异常
[ApiController][Route("[Action]")]public class UserController : ControllerBase{[HttpPost]public void Register(User user){if (string.IsNullOrEmpty(user.Name))throw new ArgumentNullException(nameof(user.Name));//todo: Impersonate a registered user}}验证全局异常处理分别启用使用异常中间件的项目以及异常过滤器的项目 , 用Postman或者通过Swagger分别请求两个项目的注册用户接口,其中Name为空,可得到以下提示,则代表全局异常处理成功
MasaFramework -- 异常处理

文章插图
进阶不论是通过中间件还是过滤器来处理全局异常,我们都支持自定义异常处理 , 我们首先来看一下异常的处理流程
MasaFramework -- 异常处理

文章插图
根据流程图可以直观的了解到,只要使用了Masa提供的异常处理 , 哪怕我们不自定义异常,框架也会帮助我们按照无自定义异常流程默认处理异常信息,但如果我们希望对特定的异常做出特定的响应,那么就需要我们自定义异常
自定义异常自定义异常支持三种方式
以中间件为例:
方案一. 通过配置ExceptionHandler(异常处理) , 修改Program.cs

推荐阅读