Asp.Net Core 异常筛选器ExceptionFilter

发布于:2025-05-01 ⋅ 阅读:(27) ⋅ 点赞:(0)


前言

在 ASP.NET Core 中,异常筛选器(Exception Filters) 是 MVC 框架提供的一种机制,用于集中处理控制器(Controller)或 Action 方法中抛出的异常。它们允许你在异常发生时拦截并自定义处理逻辑,例如记录日志、返回特定格式的错误响应或执行恢复操作。


一、异常筛选器的核心概念

用途:

  1. 统一异常处理逻辑,避免重复的 try-catch 块。
  2. 根据异常类型返回不同的 HTTP 响应。
  3. 记录异常日志或触发监控告警。

实现接口:

  1. 同步筛选器:IExceptionFilter
  2. 异步筛选器:IAsyncExceptionFilter

执行时机:

  1. 控制器Action 方法抛出未处理的异常时触发。
  2. 不处理中间件或路由之外的异常(如身份验证中间件的异常需通过中间件处理)。

二、使用步骤

1.创建自定义异常筛选器

  1. 通过实现 IExceptionFilterIAsyncExceptionFilter 接口创建自定义筛选器::
    public class MyExceptionFilter : IAsyncExceptionFilter
    {
        private readonly IWebHostEnvironment hostEnv;
    
        public MyExceptionFilter(IWebHostEnvironment hostEnv)
        {
            this.hostEnv = hostEnv;
        }
    
        public Task OnExceptionAsync(ExceptionContext context)
        {
            string msg;
            if (hostEnv.IsDevelopment())
            {
                msg=context.Exception.ToString();
            }else
            {
                msg = "服务器端发生异常未处理。";
            }
            ObjectResult objectResult = new ObjectResult(new
            {
                Code = 500,
                Message = msg
            })
            {
                StatusCode = StatusCodes.Status500InternalServerError
            };
            //ObjectResult objectResult = new ObjectResult(new ProblemDetails
            //{
            //    Title = "服务器异常",
            //    Status = StatusCodes.Status500InternalServerError,
            //    Detail = msg
    
            //});
            context.Result = objectResult;
            context.ExceptionHandled = true;
         
            return Task.FromResult(objectResult);
            //return Task.CompletedTask;
        }
    }
    

2.注册异常筛选器

全局注册(对所有 Controller 生效):

  1. 在 Program.cs 中全局注册:
    //方式一:
    //builder.Services.AddControllers(opt =>
    //{
    //    opt.Filters.Add<MyExceptionFilter>();
    //    opt.Filters.Add<MyLogExceptionFilter>();
    //});
    //方式二:
    builder.Services.Configure<MvcOptions>(opt => {
        opt.Filters.Add<MyExceptionFilter>();
        opt.Filters.Add<MyLogExceptionFilter>();
    });
    

局部注册(通过特性标记特定的 ControllerAction):

  1. 在控制器或 Action 上使用 [TypeFilter] 或 [ServiceFilter]:
    [TypeFilter(typeof(MyExceptionFilter))]
    public class HomeController : Controller
    {
        // Action 方法
    }
    

三、异常筛选器与中间件异常处理的区别

特性 异常筛选器 中间件异常处理
作用范围 仅处理 MVC 管道中的异常(控制器/Action) 处理整个请求管道中的异常
上下文信息 可访问 MVC 上下文(如 ActionContext) 仅能访问 HttpContext
响应格式控制 可返回 IActionResult(如 JSON/视图) 需手动设置响应内容和类型
适用场景 针对特定控制器或 Action 的精细化处理 全局异常处理(如未捕获的中间件异常)

四、高级用法

  1. 处理特定异常类型:
    context.Result = new BadRequestObjectResult("Business rule violation.");
    
  2. 结合ProblemDetails(RFC 7807):
    context.Result = new ObjectResult(new ProblemDetails
    {
        Title = "Server Error",
        Status = StatusCodes.Status500InternalServerError,
        Detail = context.Exception.Message
    });
    
    

五、注意事项

  • 异常处理顺序:多个筛选器按注册顺序执行,可通过 Order 属性调整优先级。
  • 未处理的异常:若筛选器未标记 ExceptionHandled = true,异常会继续传播到中间件。
  • 性能:避免在筛选器中执行耗时操作(如数据库写入),建议异步处理。

总结

  • 通过合理使用异常筛选器,可以显著提升 ASP.NET Core 应用的健壮性和错误响应一致性。
  • 对于全局异常处理,建议结合中间件:
    UseExceptionHandlerapp.UseExceptionHandler(“/error”); (全局中间件)实现 更全面的覆盖。

网站公告

今日签到

点亮在社区的每一天
去签到