文章插图
进阶不论是通过中间件还是过滤器来处理全局异常,我们都支持自定义异常处理,我们首先来看一下异常的处理流程
文章插图
根据流程图可以直观的了解到,只要使用了
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,并注册到服务集合- 自定义异常处理类
ExceptionHandler
,并继承IMasaExceptionHandler
/// <summary>/// 构造函数参数需支持从IOC获取/// </summary>public class ExceptionHandler : IMasaExceptionHandler{public void OnException(MasaExceptionContext context){if (context.Exception is ArgumentNullException ex){context.ToResult($"{ex.ParamName}不能为空");}}}
- 使用指定的异常Handler,修改
Program.cs
builder.Services.AddSingleton<IMasaExceptionHandler, ExceptionHandler>();//注册自定义异常var app = builder.Build();app.UseMasaExceptionHandler();// 在Program中执行异常处理程序
方案三. 通过自定义ExceptionHandler并指定ExceptionHandler来实现- 自定义异常处理类
ExceptionHandler
,并继承IMasaExceptionHandler
/// <summary>/// 构造函数参数需支持从IOC获取/// </summary>public class ExceptionHandler : IMasaExceptionHandler{public void OnException(MasaExceptionContext context){if (context.Exception is ArgumentNullException ex){context.ToResult($"{ex.ParamName}不能为空");}}}
- 使用指定的异常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:
- 检查是否指定了自定义异常处理的Handler,并且当前异常已经被自定义异常处理程序处理(ExceptionHandled = true)
- 检查当前异常类型是否配置了指定的日志等级,且当前日志等级小于默认记录日志的等级
IMasaExceptionHandler
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 沙发上有跳蚤怎么处理
- 厨房潮湿发霉处理方法
- 家里有壁虎怎么处理有效
- 挂面长了黑虫怎么处理
- 白衣服染上火锅底料怎么处理
- 新鲜莲子心怎么处理
- i5-12400F对比i5-11400F有哪些区别-酷睿处理器对比
- 不锈钢锅烧干锅了锅黑怎么处理
- 飞机上排泄物都是怎么处理的 飞机上的排泄物都去哪了
- 自热米饭发热包用完怎么处理