.NET 6开发TodoList应用之实现全局异常处理

2022-04-16 11:36:38
目录
需求目标原理和思路实现验证总结参考资料

需求

因为在项目中,会有各种各样的领域异常或系统异常被抛lExceptionMiddleware>(); return app; }}

验证

首先我们需要在Controller中包装我们的返回值,举一个CreateTodoList的例子,其他的类似修改:

TodoListController.cs

[HttpPost]public async Task<ApiResponse<Domain.Entities.TodoList>> Create([FromBody] CreateTodoListCommand command){    return ApiResponse<Domain.Entities.TodoList>.Success(await _mediator.Send(command));}

还记得我们在TodoList的领域实体上有一个Colour的属性吗,它是一个值对象,并且在赋值的过程中我们让它有机会抛出一个UnsupportedColourException,我们就用这个领域异常来验证全局异常处理。

为了验证需要,我们可以对CreateTodoListCommand做一些修改,让它接受一个Colour的字符串,相应修改如下:

CreateTodoListCommand.cs

public class CreateTodoListCommand : IRequest<Domain.Entities.TodoList>{    public string? Title { get; set; }    public string? Colour { get; set; }}// 以下代码位于对应的Handler中,省略其他...var entity = new Domain.Entities.TodoList{    Title = request.Title,    Colour = Colour.From(request.Colour ?? string.Empty)};

启动Api项目,我们试图以一个不支持的颜色来创建TodoList:

请求

.NET 6开发TodoList应用之实现全局异常处理

响应

.NET 6开发TodoList应用之实现全局异常处理

顺便去看下正常返回的格式是否按我们预期的返回,下面是请求所有TodoList集合的接口返回:

.NET 6开发TodoList应用之实现全局异常处理

可以看到正常和异常的返回类型已经统一了。

总结

其实实现全局异常处理还有一种方法是通过Filter来做,具体方法可以参考这篇文章:Filters in ASP.NET Core,我们之所以不选择Filter而使用Middleware主要是基于简单、易懂,并且作为中间件管道的第一个个中间件加入,有效地覆盖包括中间件在内的所有组件处理过程。Filter的位置是在路由中间件作用之后才被调用到。实际使用中,两种方式都有应用。

下一篇我们来实现PUT请求。

参考资料

1.Write custom ASP.NET Core middleware

2.FicsQTljlters in ASP.NET Core