为什么 Visual Studio 有时会在出现错误后禁止代码继续?

Why does Visual Studio sometimes disallow code from continuing after an error?

提问人:BVernon 提问时间:7/11/2023 更新时间:7/12/2023 访问量:52

问:

当 Visual Studio 在控制台应用程序中遇到未处理的错误时,它不会让执行继续正常,因此必须以某种方式解决该错误(例如,在“即时”窗口中设置一个值以避免 null 引用错误),或者必须将要执行的下一条语句设置为另一行代码。 或者干脆完全结束执行。

在 Asp.Net 应用程序中,通常情况并非如此。它通常允许您继续执行,这通常会导致您的浏览器转到错误页面。但是,在某些情况下,我发现它没有这样做,我必须重新启动我的应用程序,而不是让它继续进入错误页面。

我得到的一个选项是取消选中“抛出此异常类型时中断”,但当然我不想这样做,因为我确实希望它中断......我只想让它在它坏了之后继续,我按了 F5。

目前我处于这种情况,这很烦人,因为它在 lambda 表达式上,我无法(或者我认为不可能)更改要执行的下一个语句以克服错误,这意味着我必须结束执行并再次启动应用程序。

在这种情况下,阻止 Visual Studio 继续的逻辑是什么?我是否缺少任何解决方案可以让我在不重新启动应用程序的情况下继续?

C# asp.net Visual-Studio 调试

评论

0赞 Panagiotis Kanavos 7/11/2023
如果存在未经处理的异常,操作系统本身会终止进程。即使用户的代码不处理异常,ASP.NET 也会处理异常,以防止 Web 应用仅仅因为一个操作失败而关闭。请求处理中间件实际上将操作调用包装在一个try/catch
0赞 Panagiotis Kanavos 7/11/2023
it doesn't do this and I have to restart my application rather than just let it continue to the error page.什么场合?该代码在做什么?如果您继续,这种未经处理的错误将导致整个应用程序瘫痪
0赞 BVernon 7/12/2023
@PanagiotisKanavos 在本例中,它只是 lambda 表达式中的空引用错误。我理解你所说的操作系统杀死它并被包裹在尝试/捕获中以防止使整个应用程序瘫痪。我只是不明白为什么它不继续执行 try/catch,这应该会导致向浏览器响应错误页面,而是表现得像在不存在额外 try/catch 层的控制台应用程序中一样。
0赞 BVernon 7/12/2023
@PanagiotisKanavos我应该补充一点,在这种特定情况下,错误发生在来自位于 try/catch 块内的控制器的调用中,因此实际上它甚至不需要转到中间件。我希望它应该冒泡到控制器中的 try/catch,但只要连接了调试器,它就不会。

答:

2赞 Blindy 7/12/2023 #1

有几种方法可以获得调试中断和弹出窗口:

  • 您触发了异常,但它是在上游的某个位置处理的。只有在例外列表中显式启用异常时,才会获得中断和弹出窗口,并且可以安全地从它继续到异常处理程序。try..catch

  • 您触发了异常,但根本没有由任何内容处理。在这种情况下,无论您的异常过滤器设置如何,您都将始终收到异常弹出窗口,并且您将无法从那里继续。您的应用程序已正式死亡,无论您在内存中编辑了什么内容,下一条指令都将终止它。您所能做的就是检查应用程序的状态,并执行一些有限的操作,因为堆栈状态不稳定。

  • 您触发了本机异常,例如访问冲突或堆栈溢出。这很糟糕,而且再也回不来了。但更糟糕的是,您的托管堆栈跟踪不再可访问,您被困在本机世界中,下一条指令将终止您的应用程序。

评论

0赞 BVernon 7/12/2023
这是第一个选项,其中有问题的代码周围有一个 try/catch。但是,我不知道如何让它继续捕获......按 F5 不会导致它继续进行捕获。我会注意到代码不是“直接”在 try/catch 中,但它应该冒泡到一个。它也位于 lambda 表达式中。最后,我要提到的是,这里不涉及异步代码。那么我在这里是否遗漏了什么,或者根据我的经验,这听起来像是一个错误(当然,假设我的沟通是清晰/准确的)
0赞 BVernon 7/12/2023
需要明确的是:lambda 表达式和触发 lambda 表达式的代码行都位于同一方法中,并且该方法调用的堆栈跟踪在控制器中启动,该控制器都具有 [HandleError] 属性,并且调用也包装在 try/catch 中。所以我不明白为什么调试器不允许继续执行。
0赞 Blindy 7/12/2023
您确定异常触发器和捕获之间有直接的堆栈跟踪链接吗?您的异常没有多线程传输?你提到,Asp.Net 内部线程之间进行了很多上下文传输,也许这就是你所看到的?如果可以的话,我建议发布一些非常少但完整的复制代码,简单地编写它可能会让您深入了解问题的实际情况。HandleError