当它被抛出并被捕获时,不要停止调试器

时间:2009-09-14 08:45:16

标签: c# .net visual-studio-2008 .net-3.5 debugging

在工具/异常中,我设置了调试器在抛出异常时停止的选项。是否被抓住。

如何排除该规则的例外情况?在我的代码中的某处有一个被捕获的异常,它是程序逻辑的一部分。因此,我显然不希望该异常在每次命中时都停止调试。

示例:我想忽略第344行的null引用异常(捕获)。我想停止所有其他例外

5 个答案:

答案 0 :(得分:63)

DebuggerHidden是你的朋友!

  

公共语言运行库不向此属性添加语义。它供源代码调试器使用。例如,Visual Studio 2005调试器不会在标有此属性的方法中停止,并且不允许在方法中设置断点。 Visual Studio 2005调试器识别的其他调试器属性是DebuggerNonUserCodeAttribute和DebuggerStepThroughAttribute。

在VS2010上测试过,效果很好。

虽然DebuggerStepThrough似乎也适用于某些特定的调试器版本,但DebuggerHidden似乎适用于基于对两个答案的注释的更广泛的情况。

请注意,这两个选项目前不适用于iterator block methodsasync/await methods。这可以在稍后的Visual Studio更新中修复。

答案 1 :(得分:38)

如果我没记错,你可以在包含代码的方法上使用DebuggerStepThrough属性,而不需要触发异常。我想你可以隔离在方法中触发恼人异常的代码并用属性装饰它。

答案 2 :(得分:14)

DebuggerStepThrough用于防止调试器在有try / catch的方法中断。

但是只有在Visual Studio的调试选项的常规设置(菜单工具/选项,节点调试/常规)中没有取消选中“仅启用我的代码(仅管理)”选项时,它才有效... < / p>

有关http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

上该属性的更多信息

DebuggerHidden将阻止调试器显示抛出异常的方法。相反,它将在堆栈上显示第一个未标记该属性的方法......

答案 3 :(得分:12)

在Visual Studio 2015中,默认情况下,其他答案中指定的属性(以及DebuggerNonUserCode属性等其他答案)不再以相同的方式工作。调试器将使用这些属性打破方法市场中的异常,不像在旧版本的VS.要关闭改变其行为的性能增强,您需要更改注册表设置:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

可以在visual studio blog上找到更多信息。

(这应该是对最佳答案的评论,但我没有足够的代表)

答案 4 :(得分:3)

您无法挑出代码中特定位置抛出的异常。但是,您可以禁用特定类型的exeptions。

如果你自己的代码抛出了有问题的异常,我会把它作为一个自定义异常,从任何拟合派生出来,然后在这个派生类型上禁用debug break。

由于NullReferenceException禁用系统溢出会影响整个系统,这当然在开发过程中是不可取的。

请注意,异常有两种中断行为:

  • 抛出:如果选中,则抛出此类型的异常后立即中断
  • User-unhandled:如果选中此选项,则只有在此类型的异常未由try / catch处理时才会中断。

您可以删除NullReferenceException的'Thrown'中的检查,这样可以避免每次系统在代码中传递有问题的行时都不会中断,但如果你在其他地方遇到一些未处理的NullReference,则仍然会中断系统的一部分。