MasaFramework -- 异常处理( 二 )


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

MasaFramework -- 异常处理

文章插图
根据流程图可以直观的了解到,只要使用了Masa提供的异常处理,哪怕我们不自定义异常,框架也会帮助我们按照无自定义异常流程默认处理异常信息,但如果我们希望对特定的异常做出特定的响应,那么就需要我们自定义异常
自定义异常自定义异常支持三种方式
以中间件为例:
方案一. 通过配置ExceptionHandler(异常处理),修改Program.cs
app.UseMasaExceptionHandler(options =>{options.ExceptionHandler = context =>{// 根据context.Exception判断异常类型,并通过context.ToResult()输出响应内容if (context.Exception is ArgumentNullException ex){context.ToResult($"{ex.ParamName}不能为空");}};});方案二. 通过自定义ExceptionHandler,并注册到服务集合
  1. 自定义异常处理类ExceptionHandler,并继承IMasaExceptionHandler
/// <summary>/// 构造函数参数需支持从IOC获取/// </summary>public class ExceptionHandler : IMasaExceptionHandler{public void OnException(MasaExceptionContext context){if (context.Exception is ArgumentNullException ex){context.ToResult($"{ex.ParamName}不能为空");}}}
  1. 使用指定的异常Handler,修改Program.cs
builder.Services.AddSingleton<IMasaExceptionHandler, ExceptionHandler>();//注册自定义异常var app = builder.Build();app.UseMasaExceptionHandler();// 在Program中执行异常处理程序方案三. 通过自定义ExceptionHandler并指定ExceptionHandler来实现
  1. 自定义异常处理类ExceptionHandler,并继承IMasaExceptionHandler
/// <summary>/// 构造函数参数需支持从IOC获取/// </summary>public class ExceptionHandler : IMasaExceptionHandler{public void OnException(MasaExceptionContext context){if (context.Exception is ArgumentNullException ex){context.ToResult($"{ex.ParamName}不能为空");}}}
  1. 使用指定的异常Handler,修改Program.cs
app.UseMasaExceptionHandler(options => options.UseExceptionHanlder<ExceptionHandler>());//指定使用特定的异常处理程序
上述三种方案任选其一即可,提供的功能时一样的,仅仅是写法不同
修改HttpStatusCode状态码MasaExceptionContext默认提供了ToResult方法支持输入响应内容,状态码(默认: 299),内容类型 (默认:text/plain; charset=utf-8),我们可以根据自己的实际情况调用传参即可
修改日志级别异常类型为UserFriendlyException的默认日志等级为Information,其余异常的日志等级为Error,那么如果我想修改对应异常的日志等级应该怎么做?
配置异常日志关系:
builder.Services.Configure<MasaExceptionLogRelationOptions>(options =>{options.MapLogLevel<ArgumentNullException>(LogLevel.None);});按照此方式,可以将类型为ArgumentNullException异常的日志等级设置为None(不记录日志)
常见问题A: 为什么使用全局异常后没有记录日志?Q:
  1. 检查是否指定了自定义异常处理的Handler,并且当前异常已经被自定义异常处理程序处理(ExceptionHandled = true)
  2. 检查当前异常类型是否配置了指定的日志等级,且当前日志等级小于默认记录日志的等级
A: 实现IMasaExceptionHandler

经验总结扩展阅读