目录
[第二步:在 Program.cs 中使用中间件](#第二步:在 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
字段,或者根据环境自动判断是否返回详细信息(例如仅开发环境)。