如果我们在中间件中抛出一个未处理的异常,
throw new System.Exception();
字符串
浏览器将显示:
此页面无法显示,无法找到请求的页面
但是当有一个未处理的异常时,ASP.NET Core是如何生成http 500状态代码的呢?有人能指出https://source.dot.net/的源代码,并显示哪个类有一个“try catch”块来处理异常并将响应代码设置为500吗?
我试图找到代码在GenericWebHostService
(https://source.dot.net/#Microsoft.AspNetCore. Hosting/GenericHost/GenericWebHostService.cs,fd 20321226 ab 7078)
但我找不到相关的代码
对于那些要求在ASP.NET核心源代码中设置断点调试的人,如果你在中间件中抛出一个异常,
public class MyMiddleware
{
private RequestDelegate next;
public MyMiddleware(RequestDelegate requestDelegate) =>
next = requestDelegate;
public async Task Invoke(HttpContext context)
{
throw new System.Exception(); // <----it won't break in VS because the unhandled exception is swallowed by asp.net infrastructure
await next(context);
}
}
型
但是这个异常不会中断执行流程,这就是为什么浏览器显示500错误代码,所以一定是某个组件吞下了这个未处理的异常,我想知道是哪个组件/类这样做的
2条答案
按热度按时间twh00eeo1#
在Visual Studio中,转到
Debug
>Windows
>Exception Settings
>Common Language Runtime Exceptions
并选中System.Exception
。或者另一种简单的方法,进入正常操作并抛出新的异常,您可以看到以下窗口显示,并确保选中第一个选项:
wqlqzqxt2#
对于来自
dotnet new web
的一个简单示例(我针对.NET 7进行了测试),您可以将其在Program.cs
中的代码更改为字符串
如果在
throw new
行上设置断点并进一步调试,您应该看到try
-catch
对位于DeveloperExceptionPageMiddlewareImpl
类中,型
对于您的特定示例,您正在查找的
try
-catch
对可能位于另一个位置,但简单的调试应该可以显示位置。