Visual Studio 2015中断未处理的exception不起作用

Visual Studio曾经有一个特定的checkbox来“断开未处理的exception”。 在2015年,这已被删除(或移动的地方,我找不到)。 所以现在我的转换项目不再中断,如果我没有提供用户级exception处理程序。 我不想打破所有“抛出的exception”,因为我处理特定的exception。 就在我无法提供具体处理程序的地方。

现在我的代码只是退出当前的过程,并继续执行在下一个调用堆栈位置,不好。

任何人都知道如何回到Visual Studio 2015? 我昨天刚刚升级到社区版。

有一个名为“例外设置”的新窗口,默认情况下在开始debugging时出现在右下方的窗格中。 它具有您所期望的所有选项。

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

这允许你挑选哪些exception导致debugging器中断。

关键是,你也可以设置这些exception是否总是中断,或者只是在未处理的exception时才中断 – 但是设置这个不是很直观。

您需要先在“工具”>“选项”>“debugging”下选中“启用我的代码”。

这样,您可以在新的“例外设置”窗口中右键单击列标题(“引发时中断”),然后添加“其他操作”列,然后允许您将每个exception设置为“在用户代码中未处理时继续”。

在这里输入图像说明

更多关于这里:

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

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

  1. 按下Ctrl + Alt + e打开例外设置窗口。
  2. 勾选公共语言运行时例外在这里输入图像说明

而已!

自从我使用Windowsx64版本以来,我受到了启发。

微软已经微妙地改变了新的例外窗口中的逻辑。

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

关键部分是:

重要笔记

  • 这个新窗口包含与旧模式对话框相同的所有function。 debugging器的function只能改变你访问它们的方式
  • 当一个exception未处理时,debugging器将总是中断
  • 如果debugging程序中断了用户未处理的exception,则更改的设置已经在上下文菜单下移动
  • 菜单位置已经移到了Debug – > Windows – > Exception Settings

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

为了恢复VS在未处理的exception中断的行为,我必须勾选所有我想打破的exceptiontypes,然后确保“其他选项”(您可能需要使此列可见)为“继续时在用户代码中未处理“未设置。 VS2015的逻辑似乎并没有考虑到我的全局未处理exception处理程序是“在用户代码中处理”,所以它确实打破了这些; 尽pipe如此,它并没有打破例外。 这使得它像VS2013一样工作。

对于只在exception涉及代码时想要中断的Google员工,Visual Studio 2015中有一个选项:选项 – >debugging – >常规 – >只是我的代码。 一旦选中,在代码之外pipe理(抛出并捕获)exception时,它不会中断。

如果我在这两行之间正确阅读,问题是即使默认的debugging器行为应该中断未处理的exception,您的exception实际上正在“消失”。

如果您有asynchronous方法,则可能会遇到此问题,因为作为任务延续的一部分未在线程池线程上捕获的exception不会被视为未处理的exception。 相反,它们被吞噬并与任务一起存储。

例如,看看这个代码:

 class Program { static void Main(string[] args) { Test(); Console.ReadLine(); } private async static Task Test() { await Task.Delay(100); throw new Exception("Exception!"); } } 

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

请注意,在这种情况下,真正的问题是Test()返回的Task不会被检查。 如果你的代码中有类似的“即忘即断”的逻辑,那么在抛出exception的时候你将看不到exception(即使它们在方法内部是“未处理”的)。 只有当您通过等待观察任务,检查其结果或明确查看其exception时才会显示exception。

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

根据我的经验,如果你改变了任何东西,2015年的exception设置会被彻底抛出。

期望如果你直到父组“CLR”,那么你不应该得到任何破坏执行未处理。 如果发生exception,您将永远处于中断状态。 但是,如果您将CLR组取消勾选,则try … catch中的代码不应该导致中断。 事实并非如此。

解决scheme:在新的例外设置工具箱中,右键单击并select“恢复默认值”。 Taadaaaa …行为正常了。 现在不要拧它。

请按照说明操作:

  1. 在“exception设置”窗口中,右键单击窗口,然后select“显示列”,打开上下文菜单。 (如果您closures了“只是我的代码”,则不会看到此命令。)
  2. 您应该看到第二列名为其他操作。 此列在特定exception的用户代码未处理时显示“继续”,表示如果在用户代码中未处理该exception但在外部代码中处理该exception,debugging器不会中断。
  3. 您可以针对特定exception(selectexception,右键单击,并select/取消select在用户代码中未处理时继续)或整个exception类别(例如,所有公共语言运行时exception)更改此设置。

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

这一切都有点混乱,在我看来,不如旧的例外对话,但无论如何。

如果列表中有一个exception并勾选,那么只要抛出exception,debugging器就会中断。

如果一个exception未被选中或者不在列表中,那么只有当这个exceptiontypes是用户未处理的时候,debugging器才会中断。

例如,在下面的屏幕截图中,只要抛出System.AccessViolationExceptionexception,debugging器就会中断,但是对于所有其他exception,只有当exception是用户未处理时才会中断。

Visual Studio 2015例外工具窗口

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

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

使用VS2015时,经典的“System.Exception”就是Throw New Exception时抛出的东西。 因此,我们需要检查新的“exception设置”中的“System.Exception”

检查System.Exception框

一旦选中,我们的代码按预期做到了。

解决的办法是在语义上与你所设想的相反。 您需要确保在用户代码中未处理时的继续 未启用,在“ exception设置”选项卡的“ 其他操作”列中显示的情况下进行检查 – 请参阅下面的内容:

你有效地说在代码中未处理时不要继续(即中断)

例外设置窗口(Control + Alt + E)

去做这个:

  1. 右键单击您关心的exception或一组exception(即通常是树中最上面一行'公共语言运行时exception')
  2. select用户代码中的未处理时继续 (请参见下文)
  3. 确保没有检查exception(见下文)
  4. 继续debugging

在这里输入图像说明

那为我做了 – 再次开心。

这是在VS 2015

Visual Studio中肯定存在一些错误,可能会导致它需要重新启动。 甚至VS2015。

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

我意识到这是一个“处理”的exception,你说的是“未处理”的 – 但是我敢肯定,有时VS的快速重启将解决这个问题,如果IISRESET不。