C#怎么实现全局异常过滤器_C#如何捕获控制器报错【核心】

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 小时前
python将excel中的链接转成图片并替换链接展示在excel中【将pdf的第一页插入excel并将对应信息获取到插入签名等位置】
开发语言·python·excel
Marvel__Dead1 小时前
基于 AI 大模型的百度旋转验证识别(通用能力极强)
人工智能·爬虫·python·验证码识别·ai 大模型
多加点辣也没关系1 小时前
设计模式-享元模式
数据库·设计模式·享元模式
Leinwin1 小时前
OpenAI Daybreak实战指南:如何将AI安全检查嵌入你的开发流程
后端·python·flask
牢七1 小时前
Mailvelope
数据库
monkeyhlj1 小时前
LangChain - V1.0
python·langchain·ai编程
阿里云瑶池数据库1 小时前
如何破解多租户隔离与性能难题?PolarDB PostgreSQL实战指南
数据库·postgresql
zh路西法1 小时前
【Qwen2.5本地部署】超简单pytorch-gpu部署教程
人工智能·pytorch·python
倔强的石头_1 小时前
异构操作系统架构下的数据库表空间高级管理:路径兼容与自动化运维实战
数据库