前言在程序设计中,我们会遇到各种各样的异常问题,一个异常处理不仅仅可以帮助开发者快速的定位问题,也可以给用户更好的使用体验 , 那么我们在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
为空,可得到以下提示,则代表全局异常处理成功文章插图
进阶不论是通过中间件还是过滤器来处理全局异常,我们都支持自定义异常处理 , 我们首先来看一下异常的处理流程
文章插图
根据流程图可以直观的了解到,只要使用了
Masa
提供的异常处理 , 哪怕我们不自定义异常,框架也会帮助我们按照无自定义异常流程默认处理异常信息,但如果我们希望对特定的异常做出特定的响应,那么就需要我们自定义异常自定义异常自定义异常支持三种方式
以中间件为例:
方案一. 通过配置
ExceptionHandler
(异常处理) , 修改Program.cs
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- i5-12400F对比i5-11400F有哪些区别-酷睿处理器对比
- 使用开源计算引擎提升Excel格式文件处理效率
- 新增死信处理 它让你1小时精通RabbitMQ消息队列
- .Net CLR异常简析
- 《基于Apache Flink的流处理》读书笔记
- 苹果A15处理器参数_苹果A15处理器表现
- windows C++ 异常调用栈简析
- Java Style的C++容器流式处理类
- 手机进水怎么办,手机进水后怎么处理(手机进水了如何处理好)
- SpringBoot+MyBatis Plus对Map中Date格式转换的处理