.Net Core ExceptionFilter

作用

  • 处理全局异常
  • Authorization 和 ResourceFilter 中的异常捕捉不到

如果都设置执行顺序为:

  1. Action -> 出现异常 -> Exception处理 -> 处理完成返回对应信息或页面

实现

IExceptionFilter

IExceptionFilter

  1. 需要继承 Attribute 并 并实现 IExceptionFilter
  2. 实现接口方法

执行顺序为:

  1. 出现异常
  2. OnException

IAsyncResourceFilter

IAsyncResourceFilter

  1. 需要继承 Attribute 并 并实现 IAsyncExceptionFilter
  2. 实现接口方法

执行顺序为:

  1. 出现异常
  2. 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();
posted @ 2023-08-05 05:48  qfccc  阅读(25)  评论(0编辑  收藏  举报