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