using Application.Exceptions; using Microsoft.AspNetCore.Mvc.Filters; namespace WebApi.Filters; /// /// 全局异常过滤器 /// /// /// 统一处理Application层抛出的异常,转换为标准的BaseResponse格式 /// public class GlobalExceptionFilter(ILogger logger) : IExceptionFilter { public void OnException(ExceptionContext context) { BaseResponse response; var statusCode = 500; switch (context.Exception) { case ValidationException ex: // 业务验证失败 - 400 Bad Request logger.LogWarning(ex, "业务验证失败: {Message}", ex.Message); response = ex.Message.Fail(); statusCode = 400; break; case NotFoundException ex: // 资源未找到 - 404 Not Found logger.LogWarning(ex, "资源未找到: {Message}", ex.Message); response = ex.Message.Fail(); statusCode = 404; break; case BusinessException ex: // 业务逻辑异常 - 500 Internal Server Error logger.LogError(ex, "业务逻辑错误: {Message}", ex.Message); response = ex.Message.Fail(); statusCode = 500; break; case Application.Exceptions.ApplicationException ex: // 应用层一般异常 - 500 Internal Server Error logger.LogError(ex, "应用层错误: {Message}", ex.Message); response = ex.Message.Fail(); statusCode = 500; break; default: // 未处理的异常 - 500 Internal Server Error logger.LogError(context.Exception, "未处理的异常: {Message}", context.Exception.Message); response = "操作失败,请稍后重试".Fail(); statusCode = 500; break; } context.Result = new ObjectResult(response) { StatusCode = statusCode }; context.ExceptionHandled = true; } }