ASP.NET Core Web API中UseExceptionHandler的使用疑问
关于ExceptionHandlerMiddleware和UseExceptionHandler的两个问题解答
问题1:传入的lambda方法看似从不执行,其存在的意义是什么?
你传入的lambda是用来配置异常处理的分支管道的,但它的执行优先级低于你注册的自定义IExceptionHandler实现。
因为你已经实现了自己的ExceptionHandlerMiddleware(实现IExceptionHandler)并注册到了服务容器中,当发生异常时,框架会优先调用这个自定义处理器来处理异常,完全跳过lambda里配置的分支管道逻辑——这就是你断点没触发、空lambda也能正常运行的原因。
只有当以下两种情况出现时,lambda里的代码才会执行:
- 你没有注册任何自定义
IExceptionHandler服务; - 自定义的异常处理器处理失败(比如抛出了新的异常)。
举个例子,如果没有自定义处理器,你可以在lambda里写:
app.UseExceptionHandler(errApp => { errApp.Run(async context => { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; await context.Response.WriteAsync("自定义异常响应"); }); });
这时候异常就会走这个lambda里的响应逻辑。
问题2:为什么编译器允许无参数调用app.UseExceptionHandler(),但运行时会抛出错误?
首先,.NET框架确实提供了无参数的UseExceptionHandler重载,所以编译器会允许你调用它——这个重载的作用是默认将"/Error"作为异常处理的目标端点,框架会尝试找到匹配这个路径的端点(比如MVC的Error控制器Action、Razor页面的Error页面等)来处理异常。
而运行时抛出错误的原因,是因为你没有在项目中配置对应的"/Error"端点。比如你没写ErrorController,也没加Razor Error页面,框架找不到能处理这个路径的端点,自然就会抛出异常。如果补上对应的端点,无参数的UseExceptionHandler()就能正常工作了。
内容的提问来源于stack exchange,提问作者Mr. X
相关产品推荐
相关产品推荐

