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;
}
}