64 lines
2.1 KiB
C#
64 lines
2.1 KiB
C#
|
|
using Application.Exceptions;
|
|||
|
|
using Microsoft.AspNetCore.Mvc.Filters;
|
|||
|
|
|
|||
|
|
namespace WebApi.Filters;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 全局异常过滤器
|
|||
|
|
/// </summary>
|
|||
|
|
/// <remarks>
|
|||
|
|
/// 统一处理Application层抛出的异常,转换为标准的BaseResponse格式
|
|||
|
|
/// </remarks>
|
|||
|
|
public class GlobalExceptionFilter(ILogger<GlobalExceptionFilter> 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;
|
|||
|
|
}
|
|||
|
|
}
|