Visual Studio 2015+ C#/ .NET调试器:如何仅对unhandld异常进行破解?

时间:2017-01-07 23:36:01

标签: c# .net visual-studio debugging visual-studio-2015

所以,我已经在这个确切的主题上找到了很多资源和StackOverflow问题,但它似乎只适用于相当旧版本的Visual Studi0 - 比如2012。

我的问题是,当异常是UN-HANDLED时,我希望调试器只能中断。官方MSDN表示调试器打破了所谓的“第一次机会”#34;异常,意味着即使要处理异常,它也是打破的功能。

我发现调试器在我在try-catch中包装的InvalidCastException中断时非常烦人。有什么方法可以强制调试器忽略将要处理的第一次机会异常?一个常见的答案就是禁止破坏特定的CLR Exception类型,但这确实是一个荒谬的解决方案。我不想在任何地方压制Exception。我只是不想通知当我已经防范它时会抛出异常。

4 个答案:

答案 0 :(得分:2)

我可以想象你的挫败感,但你的VisualStudio设置必须有些奇怪。我可以向你保证,在我的设置中,VS从不会捕获所处理的异常,并且在从VS2008到VS2015的所有VS版本中都是如此。

您在输出窗口中看到的“FirstChance异常”行是在触发任何处理程序或堆栈展开之前刚刚抛出异常的信息。

并不意味着VisualStudio中的任何突破。只有一个单行程序被写入调试输出,程序继续 - 堆栈被解除,最近匹配的catch被执行,程序向前运行。

现在,VS / Debugger / CLR 可以在抛出异常时中断,但必须打开它。你可以通过Debug-> Windows-> Exceptions到达那里,或按CTRL + D + E.当您单击该面板时,应显示一个新面板,其中包含一个例外列表以及每个面板的一个或两个选项:

  • 抛出时打破
  • 打破未处理的

但这可能会因您的VS版本而异。例如,在VS社区2015中,只有“抛出时断开”,“未处理”不可见,但仍然对所有这些都有效。你无法关闭“未处理”的打破。<​​/ p>

无论如何,重要的是默认情况下,所有“未处理”都被选中,并且“当被抛出”时没有或几乎没有。在VS2015Community中,我看到默认情况下设置了“when thrown”:

  • 一些C ++“Platform :: xxxx”例外
  • System.Reflection.MissingMetadata [&lt; -C#]
  • System.Reflection.MissingRuntimeArtifact [&lt; -C#]
  • System.Windows.Markup.XamlParseException [&lt; -C#]
  • Javascript异常:拒绝访问,代码为0x80070005
  • 一些ManagedDebuggingAssistants:LoaderLock,ContextSwitch,...
  • 一些Win32例外

就是这样。也许总共10..20非常具体的类型,我没算数。在“公共语言运行时”组中,默认情况下仅检查,即上面列出的那些。没有InvalidCastExceptions。

如果您的VS在被抛出的那一刻触发,那么这意味着您或有权访问您的VS的人对其进行了不同的配置。最有可能的是,在“ExceptionSettings”面板中,您将“InvalidCastException”标记为“抛出时中断”。去那里,看看“InvalidCastExceptions”复选框的状态并取消选中它,然后重试。

如果这有助于InvalidCastExceptions的情况,并且如果此问题也发生在其他一些例外,那么您可以为任何其他类型的重复它,你不想打破抛出 。是的,这意味着在某个时间点你(或其他人)点击那里并检查它们是否打破它们。

如果您检查了其中许多信息,那么您可以点击子树根,然后选中/取消选中整个组,而不是点击每个。 (顺便说一句,也许你偶然点击并在一周或一个月前检查了整个团队?)

此外,还有一个非常有用的“恢复默认值”,甚至还有一个名为“将列表恢复到默认设置”的按钮,这两个按钮都只是将所有内容重置为默认设置(就像我上面写的列表中的一些:C ++,一些反思,一些win32,等等。)

最后,无论您在ExceptionSettings面板中取消选择 break-on-thrown 的例外情况,VisualStudio仍会在任何未处理的异常中中断。 (除非你看到另一组复选框,标记为“未处理” - 在VS2010Pro中有这样的东西,但在VS2015社区中我没有看到它......也许它是专业的东西)

答案 1 :(得分:0)

从Visual Studio 2015开始,您可以转到Debug - &gt; Windows - &gt;例外设置。您可以根据具体情况定义要自动中断的异常。当VS中断异常时,还有一个指向此窗口的链接 - 单击&#34;例外设置&#34;在窗口的底部。

在我的家用电脑上,我只看到一列,&#34; Thrown&#34;,所以在你看来,没有办法只抛出未处理的异常。但是,在工作中,我有一个名为&#34; User Unhandled&#34;的第二列,这使我可以完全按照您的意思进行操作。离开&#34;用户未处理&#34;选中并取消选中&#34;抛出&#34;导致它仅在未处理的异常上破坏,而不是在被捕获的异常上破坏。我认为这可能是Visual Studio Professional版的一个功能 - 在家里我使用的是Community Edition。

答案 2 :(得分:0)

如果您使用VS2015之类的较高VS版本,则它无法启用/禁用Old VS版本之类的Unhandled Exception,但它有自己的功能:

enter image description here

因此,如果我们只想捕获未处理的异常,我们可以禁用该复选框。

  
    

有什么方法可以强制调试器忽略将要处理的第一次机会异常?

         

我不想在任何地方压制Exception。我只是不想被告知当我已经防范它时会抛出异常。

  

但是如果您仍然希望获得将要处理的第一个更改异常消息,则此问题没有好的解决方法,因为此时调试器不知道应用程序是否将捕获(处理)异常,如果启用该复选框,它将捕获第一次机会异常(当应用程序中首次抛出异常时,这被归类为“第一次机会”异常)。

参考:

https://blogs.msdn.microsoft.com/visualstudioalm/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015/

https://blogs.msdn.microsoft.com/visualstudioalm/2015/01/07/understanding-exceptions-while-debugging-with-visual-studio/#unhandled

答案 3 :(得分:-2)

请记住,您可以在Release或Debug旁边定义自己的构建配置,它可以遵循代码中的#if <name>#endif标记。在那里,您可以根据配置决定是否要关注异常。