MasaFramework -- 异常处理( 二 )


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后 , 为什么发生异常后没有进入OnExceptionQ: 未注入到服务集合且没有指定使用指定的ExceptionHanlder
  • 自定义异常Handler
public class ExceptionHandler : IMasaExceptionHandler{public void OnException(MasaExceptionContext context){throw new NotImplementedException();}}可参考自定义异常中的方案二或者方案三修改即可
总结Masa提供的全局异常中间件,对自定义异常的扩展支持较好 , 并且后续Masa Framework支持I18n后,全局异常也将增加I18n支持, 届时全局异常会更加方便
本章源码Assignment13
https://github.com/zhenlei520/MasaFramework.Practice
开源地址MASA.Framework:https://github.com/masastack/MASA.Framework
MASA.EShop:https://github.com/masalabs/MASA.EShop
MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor
如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue , 欢迎联系我们
MasaFramework -- 异常处理

文章插图

推荐阅读