.Net Core ExceptionFilter
目录
- 作用
- 实现
- IExceptionFilter
- IAsyncResourceFilter
- Demo
- CustomExceptionFilterAttribute.cs
- 全局注册
- Program.cs
作用
- 处理全局异常
- Authorization 和 ResourceFilter 中的异常捕捉不到
如果都设置执行顺序为:
- Action -> 出现异常 -> Exception处理 -> 处理完成返回对应信息或页面
实现
IExceptionFilter
IExceptionFilter
- 需要继承 Attribute 并 并实现 IExceptionFilter
- 实现接口方法
执行顺序为:
- 出现异常
- OnException
IAsyncResourceFilter
IAsyncResourceFilter
- 需要继承 Attribute 并 并实现 IAsyncExceptionFilter
- 实现接口方法
执行顺序为:
- 出现异常
- OnExceptionAsync
Demo
CustomExceptionFilterAttribute.cs
using Microsoft.AspNetCore.Mvc.Filters;
namespace Cnpc.Com.Ioc.WebApp.Filter.Exception
{
public class CustomExceptionFilterAttribute : Attribute, IAsyncExceptionFilter
{
ILogger<CustomExceptionFilterAttribute> logger;
public CustomExceptionFilterAttribute(ILogger<CustomExceptionFilterAttribute> logger)
{
this.logger = logger;
}
public async Task OnExceptionAsync(ExceptionContext context)
{
if (!context.ExceptionHandled)
{
this.logger.LogError(context.Exception.Message, context.Exception.StackTrace);
}
//异常已经处理完成
context.ExceptionHandled = true;
await Task.CompletedTask;
}
}
}
全局注册
Program.cs
builder.Services.AddControllersWithViews(
options =>
{
//这样注册将对所有action 都生效
options.Filters.Add<CustomAsyncAlwaysRunResultFilterAttribute>();
}).AddControllersAsServices();