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智能写作,写文档、写报告如此简单
相关推荐
AI-好学者5 小时前
阶段一-图数据库基础与PropertyGraph模型向日的葵0066 小时前
langchain的Tools教程(三)其实防守也摸鱼7 小时前
运维--学习阶段问题解答(1)(自测)懒鸟一枚7 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系龙仔7257 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)言乐67 小时前
Python实现可运行解密游戏游戏框架霁月的小屋7 小时前
生产环境中的事务实践——银行系统上线记(四)YUS云生8 小时前
Python学习笔记·第31天:FastAPI入门——路由、路径参数、查询参数与请求体Database_Cool_8 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑玖玥拾8 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库