Visual Studio 2015 break on unhandled exceptions not working

Visual studio used to have a specific checkbox to "Break on Un-handled exception". In 2015 this has been removed (or moved somewhere I cannot find it). So now my converted projects no longer break if I fail to provide a user-level exception handler. I don't want to break on all "thrown exceptions" because I handle specific ones. Just where I fail to provide a specific handler.

Right now my code simply exits the current procedure and continues execution at the next call stack location, NOT GOOD.

Anyone know how to get this back in Visual Studio 2015? I just upgraded to the community edition yesterday.

54312 次浏览

在开始调试时,默认情况下,右下窗格中会出现一个名为“异常设置”的新窗口。它有你想要的所有选择。

你可以用 CTRL + ALT + E调出来

这允许您挑选导致调试器中断的异常。

但是,关键是您还可以设置这些异常是总是中断,还是只有在它是未处理的异常时才中断——但是设置这一点并不是很直观。

你需要先在工具 > 选项 > 调试下选择“启用我的代码”。

然后,您可以在新的异常设置窗口中右键单击列标题(抛出时中断) ,并添加“附加操作”列,然后允许您将每个异常设置为“在用户代码中未处理时继续”。

因此,只需右键单击一个异常或整个组,并禁用“在用户代码中未处理时继续”标志。遗憾的是,“其他操作”列将显示为空,这与“在用户代码中未处理时中断”相同。

enter image description here

更多相关信息请点击这里:

Http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

对于那些只想在异常与代码有关时才中断的 Google 用户来说,Visual Studio 2015中有一个选项: Options-> Debug-> General-> Just My Code。选中此选项后,它允许在代码之外管理(抛出和捕获)异常时不中断。

试着按照下面的说明做:

  1. 在“异常设置”窗口中,右键单击窗口中的“上下文”菜单,然后选择“显示列”。(如果您关闭了 Just My Code,则不会看到此命令。)
  2. 您应该会看到名为“附加操作”的第二列。当用户代码未处理特定异常时,此列将显示“继续”,这意味着如果该异常未在用户代码中处理,而是在外部代码中处理,则调试器不会中断。
  3. 您可以针对特定异常(选择异常,右键单击,并选择/取消选择“在用户代码中未处理时继续”)或针对整个异常类别(例如,所有通用语言运行库异常)更改此设置。

https://msdn.microsoft.com/en-us/library/x85tt0dd.aspx

如果我没有理解错的话,问题在于,即使默认的调试器行为应该在未处理的异常上中断,但是您的异常实际上正在“消失”。

如果您有异步方法,您可能会遇到这个问题,因为作为 Task 延续的一部分,线程池线程上没有捕获到的异常不被认为是未处理的异常。相反,它们被吞噬并与 Task 一起存储。

例如,看一下这段代码:

class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}


private async static Task Test()
{
await Task.Delay(100);
throw new Exception("Exception!");
}
}

如果使用默认调试器设置运行此程序(仅在未处理的异常时停止) ,则调试器将不会中断。这是因为分配给延续的线程池线程吞噬了异常(将其传递给 Task 实例) ,并将自身释放回池中。

注意,在这种情况下,真正的问题是从未检查 Test()返回的 Task。如果你的代码中有类似类型的“发射-然后忘记”逻辑,那么在抛出异常时你不会看到异常(即使它们在方法中是“未处理的”) ; 只有当你通过等待、检查结果或显式查看异常来观察 Task 时,异常才会显示出来。

这只是一个猜测,但我认为你很可能正在观察这样的事情。

在 VisualStudio 中肯定有一些 bug 会导致它卡住,需要重新启动,甚至 VS2015也是如此。

我有一个单线程的情况下,NullReferenceException被一个“外部”处理程序(仍然在我的代码中)捕获,即使我要求它在提出时中断。

我知道这是一个“已处理”的异常,而你说的是一个“未处理”的异常——但是我非常肯定,有时快速重新启动 VS 可以修复这个问题,如果 IISRESET 不能的话。

我有同样的问题,我设法解决这个问题,通过这样做-

  1. Ctrl + Alt + e打开 异常设置窗口。
  2. 通用语言运行库例外enter image description here

就是这样!

我的灵感是这个 post,因为我使用的是 X64版本的 Windows

It's all a bit confusing, and in my opinion not as good as the old exceptions dialog, but anyway.

如果列表中有异常并打勾,则每当引发异常时调试器都会中断。

If an exception is unticked or not in the list then the debugger will only break when that exception type is user unhandled.

例如,在下面的屏幕快照中,只要抛出 System.AccessViolationException,调试器就会中断,但是对于所有其他异常,它只有在用户未处理该异常时才会中断。

Visual studio 2015 exceptions tool window

Microsoft have subtly changed the logic in the new exceptions window.

参见 http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx

关键部分是:

重要提示

  • 这个新窗口包含与旧模式对话框相同的所有功能。除了您可以访问的方式之外,调试器的功能没有发生任何更改
  • 当未处理异常时,调试器总是会中断
  • 如果调试器在用户未处理的异常中断时要更改的设置已移动到上下文菜单下
  • 菜单位置已移动到 Debug-> Windows-> Exception Settings

然而 ,如果你像我一样在你的代码中有一个 全局未处理异常处理程序,那么列表中的第二项是关键: 对我来说,没有异常会因此真正未处理,这似乎与 VS2013不同。

为了恢复 VS 在未处理的异常上中断的行为,我必须勾选所有我想要中断的异常类型,然后确保“其他选项”(你可能需要让这一列可见 *)“在用户代码中未处理时继续”的“其他选项”设置为 NOT。VS2015逻辑 does not似乎认为我的 全局未处理异常处理程序是“在用户代码中处理的”,所以它确实在这些上中断; 但是它不会在捕捉到的异常上中断。这使它像 VS2013一样工作。

* 如何启用“其他操作”栏 *How to enable the "Additional Actions" column

根据我的经验,2015年的异常设置完全不正常,如果您更改任何东西。

预计,如果您直到父组“ CLR”,那么您不应该得到任何未处理的中断执行。如果未处理异常,则总是会中断。但是,如果没有勾选 CLR 组,那么 try... catch 中的代码就不应该导致中断。事实并非如此。

解决方案: 在新的异常设置工具箱中,右击并选择“恢复默认值”。Taadaaaa... 它又恢复正常了。别搞砸了。

当我升级到 VS2015时,我也遇到了一些问题,例外过去常常“破坏”应用程序,但是现在被忽略并被忽略了。有时候,我们希望我们的代码 故意的抛出异常的地方,我们希望代码停止,而不是继续。我们总是使用短语 Throw New Exception("Message")来使我们的代码故意中断:

    If SomethingReallyBad = True Then
Throw New Exception("Something Really Bad happened and we cannot continue.")
End If

与 VS2015,经典的“系统。当我们说 Throw New Exception时抛出的是“异常”。因此,我们需要检查「。“异常”在新的异常设置中打勾:

选中 System.Exception 框

一旦检查完毕,我们的代码就按预期执行了。

解决这个问题的方法是在语义上与您认为的设置相反。你需要确保 在用户代码中未处理时继续没有启用,即 没有检查,如在 异常设置选项卡的 附加行动栏所示-见下文:

你实际上是在说 在代码中未处理时不要继续(即中断)

Exception Settings window (Control+Alt+E)

要做到这一点:

  1. 右键单击 您关心的异常或异常集合(例如,通常在树中的顶行“通用语言运行库异常”)
  2. Select the option 在用户代码中未处理时继续 (see below)
  3. 确保异常是 没有检查(见下文)
  4. 继续调试

enter image description here

我又高兴了。

这是在 VS 2015

VisualStudio2017可以很好地处理错误。另一方面,Visual Studio 2015在错误处理任务方面很糟糕,因为在调试模式下,异步任务中发生的所有异常都会被捕获,但是如果我跨过它,它就会无限期地挂起。如果在没有调试的情况下执行,它将无限期地挂起,没有异常被捕获! ! !我喜欢视觉工作室,从1995年开始使用,2015年是最糟糕的版本,尽管我从2010年直接跳到了2015年。我花了8个小时试图让这个异常处理工作没有成功。我在家里的电脑上复制了2017年的准确代码,它运行得很好。微软将任务推入一个2015编译器无法正确处理的框架,这让我非常恼火。