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智能写作写文档、写报告如此简单