引发并捕获该异常时,不要在该异常时停止调试器


91

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

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

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


6
当此异常是您的编程逻辑的一部分时(请考虑一下,如果您确实必须以这种方式实现它)-那么它至少应是一个自己创建的派生异常。这样,您可以应用Brian的解决方案。
tanascius


2
@tanascius-+1在大多数情况下,我都同意例外并不是做出合理决定的最佳方法;但是,在某些情况下,例如反序列化处理异常有时是不可避免的,因此throw> catch> handle是唯一合理的选择。
jpierson 2011年

2
@安藤对不起我的坏。一次审核多个标签是有效的,但并不总是准确的。

2
@tanascius:您可能仍然必须捕获一个已知的框架异常,然后才能抛出自己的响应。您的建议并非总是可行。
丹·普兹

Answers:


40

如果我没记错的话,您可以DebuggerStepThrough在方法中使用一个属性,该属性包含您不希望引发异常的代码。我想您可以在方法中隔离引发烦人异常的代码,并用属性对其进行修饰。


31
从玛林格的答案和我的经验来看,这个答案似乎是错误的。该DebuggerStepThrough属性不会影响调试器的优先机会异常行为。
Michael Petrotta 2010年

5
@Tim,我测试了一下,但没有停止。结帐我的答案:stackoverflow.com/questions/1420390/3455100#3455100
Shimmy Weitzhandler 2010年

1
+1在VS2010中可用于纯.NET 4.0,而Silverlight 4代码可用于未处理的异常。
Mike Post,

6
重要说明:这不适用于异步等待类型方法。更多在这里
i3arnon

8
根据MSDN,该DebuggerStepThrough属性对CLR没有意义。它由调试器解释。似乎它不能在各种情况下可靠地工作,并且DebuggerHidden可以可靠地工作stackoverflow.com/a/3455100/141172
Eric J.

64

DebuggerHidden 是你的朋友!

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

在VS2010上测试,效果很好。

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

请注意,这两个选项当前均不适用于迭代器块方法async / await方法。可以在以后的Visual Studio更新中修复此问题。


在VS2008上工作。您必须将其应用于包括catch块在内的整个方法,否则您将在其他地方中断
Mark Heath,2010年

1
我将该属性添加到方法中,调试器只是在调用该方法时停止了。我想念什么吗?
Doogal 2010年

1
那是应该的。为避免这种情况,您必须处理异常...或者也标记调用方方法DebuggerHidden...
Shimmy Weitzhandler 2010年

1
请注意,DebuggerStepThrough属性应足以避免发生异常。DebuggerHidden就像DebuggerNonUserCode和DebuggerStepThrough属性的组合一样。
jpierson 2011年


14

DebuggerStepThrough是用于防止调试器闯入有try / catch方法的程序。

但是,只有在您未取消选中Visual Studio调试选项的常规设置(菜单工具/选项,节点调试/常规)中的“仅启用我的代码(仅受管理)”选项时,此选项才起作用。

有关该属性的详细信息,请访问http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

DebuggerHidden只会阻止Debugger显示引发异常的方法。相反,它将在堆栈上显示未用该属性标记的第一个方法...


1
请注意,默认情况下,此选项在VS 2015中不再起作用,请参见VS博客以了解如何启用它
bhh

可悲的是在2015年VS变通不工作VS 2019
乔纳森·艾伦

13

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

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

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

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


3

您无法选择在代码中特定位置抛出的异常。但是,您可以禁用特定类型的肽段。

如果您自己的代码引发了有关异常的问题,我将使其成为自定义异常,从任何合适的位置派生,然后在此派生类型上禁用调试中断。

将系统实例禁用为NullReferenceException将影响整个系统,这当然在开发过程中是不可取的。

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

  • 抛出:如果选中,则抛出此类型的异常后立即中断
  • 用户未处理:如果选中,则仅在尝试/捕获未处理此类异常时中断。

您可以删除NrowReferenceException的“ Thrown”检查,这将使您不必每次系统通过代码中有问题的行时都不会中断,但如果在其他部分发生了一些未处理的NullReference期望,仍可以中断系统。


3
在Visual Studio 2010中将DebuggerStepThrough属性添加到方法中将防止调试器停止该方法抛出未处理的异常。
Tim Murphy

我进行了测试,但并不能阻止;它仍然停止
Shimmy Weitzhandler 2010年

1
@Shimmy-为我工作!确保从引发错误的点到希望异常在调用堆栈中可见的点,将DebuggerStepThrough应用于每个方法。如果捕获异常并在调用方法中处理该异常,在该调用层次中,所有方法都用DebuggerStepThrough装饰,那么您将永远不会看到VS在该异常上中断。
jpierson 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.