记录一下DotNET6 WebAPI全局异常处理
通常接口出现一些小错误,页面会返回一堆看不懂的代码
这对于我们寻找错误并没有什么太大的帮助,反而看着很难受
遇到这种情况我们可以写一个全局异常过滤器,接口报错直接跳到过滤器
首先新建一个ExceptionFilter类,继承至ExceptionFilterAttribute
代码如下
/// <summary>
/// 全局异常过滤器
/// </summary>
public class ExceptionFilter : ExceptionFilterAttribute
{
private readonly ILogger<ExceptionFilter> _logger;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="logger"></param>
public ExceptionFilter(ILogger<ExceptionFilter> logger)
{
_logger = logger;
}
/// <summary>
/// 全局捕获异常方法
/// </summary>
/// <param name="context"></param>
public override void OnException(ExceptionContext context)
{
if (!context.ExceptionHandled)
{
context.Result = new JsonResult(new { Code = 500, Message = context.Exception.Message, Data = "接口发生错误" });
string ActionRoute = ((Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)context.ActionDescriptor).DisplayName;
_logger.LogError("请求路径:{0},错误信息:{1}", ActionRoute, context.Exception.Message);
context.ExceptionHandled = true;
}
}
}
请求拦截器
/// <summary>
/// 请求拦截器
/// </summary>
public class GlobalActionFilter : IActionFilter
{
private readonly ILogger<GlobalActionFilter> _logger;
public GlobalActionFilter(ILogger<GlobalActionFilter> logger)
{
_logger = logger;
}
/// <summary>
/// 执行方法前
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
//执行方法前先执行这
_logger.LogInformation("执行前");
}
/// <summary>
/// 执行方法后
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{
//执行方法后执行这
_logger.LogInformation("执行后");
}
}
然后在Program类里面全局配置
var builder = WebApplication.CreateBuilder(args);
// 异常处理
builder.Services.AddMvcCore(options =>
{
// 异常过滤器
options.Filters.Add<ExceptionFilter>();
// Action拦截器
options.Filters.Add<GlobalActionFilter>();
}).AddJsonOptions(options =>
{
// 配置Json序列化大小写处理
options.JsonSerializerOptions.PropertyNamingPolicy = null;
options.JsonSerializerOptions.DictionaryKeyPolicy = null;
// 解决中文被编码
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});
接口异常就会返回错误信息供开发人员排查,为了防止返回的Json大小写不匹配,我还加了Json大小写处理,确定Json输出和后台定义的格式以及大小写一致,和返回的中文乱码情况
被这风吹散的人说Ta爱的不深,被这雨淋湿的人说Ta不会冷