dotnet core webapi 实现 异常处理中间件
目录
第一步:创建异常处理中间件类(自定义响应格式)
第二步:在 Program.cs 中使用中间件
三、效果
第一步:创建异常处理中间件类(自定义响应格式)
public static class ExceptionMiddlewareExtensions
{public static void ConfigureExceptionHandler(this IApplicationBuilder app, ILogger logger){app.UseExceptionHandler(appError =>{appError.Run(async context =>{context.Response.StatusCode = StatusCodes.Status500InternalServerError;context.Response.ContentType = "application/json";var contextFeature = context.Features.Get<IExceptionHandlerFeature>();if (contextFeature != null){logger.LogError($"Something went wrong: {contextFeature.Error}");await context.Response.WriteAsync(new{StatusCode = context.Response.StatusCode,Message = "Internal Server Error. Please try again later.",Detailed = contextFeature.Error.Message // 可以移除或改为只在开发模式返回}.ToStringJson());}});});}private static string ToStringJson(this object obj){return System.Text.Json.JsonSerializer.Serialize(obj);}
}
第二步:在 Program.cs
中使用中间件
var builder = WebApplication.CreateBuilder(args);// 日志支持
var logger = LoggerFactory.Create(config => config.AddConsole()).CreateLogger("GlobalExceptionHandler");var app = builder.Build();// 注册全局异常处理中间件
app.ConfigureExceptionHandler(logger);// 其他中间件(如路由、授权等)
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();app.Run();
三、效果
当你的接口中出现未捕获的异常(例如空引用、除零等)时,将统一返回如下格式的响应:
{"StatusCode": 500,"Message": "Internal Server Error. Please try again later.","Detailed": "Object reference not set to an instance of an object."
}
你可以根据需要隐藏 Detailed
字段,或者根据环境自动判断是否返回详细信息(例如仅开发环境)。