Asp.Net Core 异常筛选器ExceptionFilter
文章目录
- 前言
- 一、异常筛选器的核心概念
- 用途:
- 实现接口:
- 执行时机:
- 二、使用步骤
- 1.创建自定义异常筛选器
- 2.注册异常筛选器
- 全局注册(对所有 Controller 生效):
- 局部注册(通过特性标记特定的 **Controller** 或 **Action**):
- 三、异常筛选器与中间件异常处理的区别
- 四、高级用法
- 五、注意事项
- 总结
前言
在 ASP.NET Core 中,异常筛选器(Exception Filters) 是 MVC 框架提供的一种机制,用于集中处理控制器(Controller)或 Action 方法中抛出的异常。它们允许你在异常发生时拦截并自定义处理逻辑,例如记录日志、返回特定格式的错误响应或执行恢复操作。
一、异常筛选器的核心概念
用途:
- 统一异常处理逻辑,避免重复的 try-catch 块。
- 根据异常类型返回不同的 HTTP 响应。
- 记录异常日志或触发监控告警。
实现接口:
- 同步筛选器:IExceptionFilter
- 异步筛选器:IAsyncExceptionFilter
执行时机:
- 当控制器或 Action 方法抛出未处理的异常时触发。
- 不处理中间件或路由之外的异常(如身份验证中间件的异常需通过中间件处理)。
二、使用步骤
1.创建自定义异常筛选器
- 通过实现 IExceptionFilter 或 IAsyncExceptionFilter 接口创建自定义筛选器::
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 生效):
- 在 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>(); });
局部注册(通过特性标记特定的 Controller 或 Action):
- 在控制器或 Action 上使用 [TypeFilter] 或 [ServiceFilter]:
[TypeFilter(typeof(MyExceptionFilter))] public class HomeController : Controller {// Action 方法 }
三、异常筛选器与中间件异常处理的区别
特性 | 异常筛选器 | 中间件异常处理 |
---|---|---|
作用范围 | 仅处理 MVC 管道中的异常(控制器/Action) | 处理整个请求管道中的异常 |
上下文信息 | 可访问 MVC 上下文(如 ActionContext) | 仅能访问 HttpContext |
响应格式控制 | 可返回 IActionResult(如 JSON/视图) | 需手动设置响应内容和类型 |
适用场景 | 针对特定控制器或 Action 的精细化处理 | 全局异常处理(如未捕获的中间件异常) |
四、高级用法
- 处理特定异常类型:
context.Result = new BadRequestObjectResult("Business rule violation.");
- 结合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”); (全局中间件)实现 更全面的覆盖。