造轮子之统一业务异常处理
1.Asp.Net Core造轮之旅:逐步构建自己的开发框架-目录2.asp.net core之Startup3.asp.net core之依赖注入4.asp.net core之中间件5.asp.net core之Host6.asp.net core之Kestrel7.asp.net core之配置8.asp.net core之Options9.asp.net core之日志10.asp.net core之路由11.asp.net core之异常处理12.asp.net core之HttpClient13.asp.net core之实时应用14.asp.net core之EfCore15.造轮子之自动依赖注入16.造轮子之日志
17.造轮子之统一业务异常处理
18.造轮子之统一请求响应格式19.造轮子之缓存20.造轮子之ORM集成21.造轮子之asp.net core identity22.造轮子之自定义授权策略23.造轮子之权限管理24.造轮子之多语言管理25.造轮子之角色管理26.造轮子之用户管理27.造轮子之菜单管理28.造轮子之属性注入配合懒加载构建服务抽象基类29.造轮子之EventBus30.造轮子之消息实时推送31.造轮子之种子数据32.造轮子之集成GraphQL33.造轮子之设置管理34.造轮子之文件管理35.造轮子之单层应用总结篇36.单层应用升级到多层应用137.单层应用升级到多层应用238.单层应用升级到多层应用3异常处理也是我们必不可少的一环,借助Asp.netCore的UseExceptionHandler中间件,我们可以很轻易的配置我们的业务异常处理逻辑。
自定义业务异常类#
首先我们定义一个业务异常类,继承Exception,添加一个Code状态码属性,和MessageData数组,这个数组用于Format异常信息。在实际业务场景中可以灵活扩展此类。
namespace Wheel.Core.Exceptions
{
public class BusinessException : Exception
{
public string Code { get; set; }
public string[]? MessageData { get; set; }
public BusinessException(string code, string? message = "") : base(message)
{
Code = code;
}
public BusinessException WithMessageDataData(params string[] messageData)
{
MessageData = messageData;
return this;
}
}
}
约定错误码#
在业务开发中,我们经常需要根据错误码去判断具体的业务错误类型。所以我们需要约定一个错误码格式。
创建一个ErrorCode类。
/// <summary>
/// 错误码
/// 约定5位数字字符串
/// 4XXXX:客户端错误信息
/// 5XXXX: 服务端错误信息
/// </summary>
public class ErrorCode
{
#region 5XXXX
public const string InternalError = "50000";
#endregion
#region 4XXXX
#endregion
}
这里我们约定一下5位数错误码,5开头则服务端的错误类型,4开头则客户端错误类型。当然,往后可以按照实际业务需求做出更多的约定或者改动。
UseExceptionHandler#
接下来使用UseExceptionHandler配置我们的异常处理逻辑。
在Program中添加代码。
app.UseExceptionHandler(exceptionHandlerApp =>
{
exceptionHandlerApp.Run(async context =>
{
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
// using static System.Net.Mime.MediaTypeNames;
context.Response.ContentType = Application.Json;
var exceptionHandlerPathFeature =
context.Features.Get<IExceptionHandlerPathFeature>();
if (exceptionHandlerPathFeature?.Error is BusinessException businessException)
{
var L = context.RequestServices.GetRequiredService<IStringLocalizerFactory>().Create(null);
if (businessException.MessageData != null)
await context.Response.WriteAsJsonAsync(new R { Code = businessException.Code, Message = L[businessException.Message, businessException.MessageData] });
else
await context.Response.WriteAsJsonAsync(new R { Code = businessException.Code, Message = L[businessException.Message] });
}
else
{
await context.Response.WriteAsJsonAsync(new R { Code = ErrorCode.InternalError, Message = exceptionHandlerPathFeature?.Error.Message });
}
});
});
这里判断如果是我们的BusinessException类型异常,则返回统一的Json结构,并且使用多语言处理我们的异常信息。
到这我们就轻松的完成了我们的统一业务异常处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?