前言在程序设计中,我们会遇到各种各样的异常问题,一个异常处理不仅仅可以帮助开发者快速的定位问题,也可以给用户更好的使用体验,那么我们在AspNetCore项目中如何捕获以及处理异常呢?
而对应AspNetCore程序,我们有两种异常处理方案,它们分别是:
- 异常中间件
- 异常过滤器
Masa Franework
作为一个框架,它为开发者以及用户提供更好的开发体验和使用体验的异常处理功能Masa.Utils.Exceptions
中定义了两种异常类UserFriendlyException
(友好异常)MasaException
(框架异常)
- 异常中间件
- 异常过滤器
根据需要自行选择一种方案使用即可快速入门项目基于.NET 6.0创建,必须安装所必须的环境
- 安装.NET 6.0
- 新建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 //提供全局异常过滤器
- 新建用户类
User
public class User{public string Name { get; set; }public int Age { get; set; }}
- 使用全局异常,修改
Program
//支持处理自定义异常app.UseMasaExceptionHandler(options =>{//支持处理自定义异常options.ExceptionHandler = context =>{if (context.Exception is ArgumentNullException ex){context.ToResult($"{ex.ParamName}不能为空");}};});
- 新增注册用户方法(用于自定义抛出异常)
app.MapPost("/register", (User user) =>{if (string.IsNullOrEmpty(user.Name))throw new ArgumentNullException(nameof(user.Name));//todo: Impersonate a registered user});
更多使用技巧可查看异常过滤器基于MVC的全局异常过滤器,用于捕捉应用程序异常,并将异常信息处理后返回
- 新建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 //提供全局异常过滤器
- 新建用户类
User
public class User{public string Name { get; set; }public int Age { get; set; }}
- 使用全局异常过滤器,修改
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);}};});
- 新增注册用户方法,用于自定义抛出异常
[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
为空,可得到以下提示,则代表全局异常处理成功经验总结扩展阅读
- 沙发上有跳蚤怎么处理
- 厨房潮湿发霉处理方法
- 家里有壁虎怎么处理有效
- 挂面长了黑虫怎么处理
- 白衣服染上火锅底料怎么处理
- 新鲜莲子心怎么处理
- i5-12400F对比i5-11400F有哪些区别-酷睿处理器对比
- 不锈钢锅烧干锅了锅黑怎么处理
- 飞机上排泄物都是怎么处理的 飞机上的排泄物都去哪了
- 自热米饭发热包用完怎么处理