UseExceptionHandler捕获中间件管道未处理异常,IExceptionFilter仅处理MVC层Action内异常;两者可共存,前者兜底后者细粒度定制。ASP.NET Core 里 UseExceptionHandler 和 IExceptionFilter 到底该用哪个控制器报错捕获,不是"加个过滤器就行",得看错误发生在哪一层。UseExceptionHandler 捕的是中间件管道里未处理的异常(包括控制器抛出但没被 catch 的),而 IExceptionFilter 只管 MVC 层------也就是 Controller 执行过程中、进入 Action 之后、返回结果之前这段。如果异常发生在模型绑定、授权过滤器或自定义中间件里,IExceptionFilter 根本收不到。UseExceptionHandler 是兜底方案,适合统一返回错误页或 JSON 错误响应,但拿不到 ActionContext,没法做细粒度响应定制(比如按不同 Controller 返回不同结构)IExceptionFilter 能访问 ExceptionContext 和当前 action 信息,适合记录日志、补充上下文、局部响应覆盖,但对 400 Bad Request(如模型验证失败)这类非异常流程无效两者可以共存:先由 IExceptionFilter 处理可预判的业务异常,再靠 UseExceptionHandler 拦住漏网的运行时崩溃OnException 里为什么 context.Result 设了却没生效常见现象:在 OnException 方法里写了 context.Result = new JsonResult(...),但浏览器还是看到默认黄页或空响应。根本原因是没调 context.ExceptionHandled = true ------ ASP.NET Core 默认认为你只是"看了眼异常",还要继续往上抛。必须显式设 context.ExceptionHandled = true,否则后续中间件(包括 UseExceptionHandler)仍会介入不要在 OnException 里 throw 新异常,这会导致二次崩溃,且可能绕过你刚设的 Result如果用了 ApiController 特性,部分异常(如 ModelStateInvalid)根本不会触发 IExceptionFilter,它走的是内置的 InvalidModelStateResponseFactory全局过滤器注册时 AddControllers 和 AddMvc 的区别项目模板不同,API 和 MVC 混用时容易配错入口。.NET 6+ 推荐用 AddControllers,它只注册控制器相关服务;而 AddMvc 还带视图引擎、Razor Pages 等一堆你可能不需要的东西,体积大、启动慢,且在纯 API 项目里反而可能引入意外行为(比如试图解析 .cshtml)。 知网AI智能写作 知网AI智能写作,写文档、写报告如此简单
相关推荐
曲幽1 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API渣波1 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码荣码1 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面兵慌码乱11 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析金銀銅鐵12 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程FreakStudio16 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发用户03321266636717 小时前
使用 Python 从零创建 Word 文档Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了用户556918817531 天前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录