我可以以编程方式启用/禁用exception中断吗?

我希望能够在调试时中断exception…就像在Visual Studio 2008的菜单调试/exception对话框中一样,除了我的程序在到达我希望调试的位之前有许多有效的exception。

因此,不是每次都使用对话框手动启用和禁用它,而是可以使用#pragma或其他方法自动执行它,因此它只发生在特定的代码段中?

接近这一点的唯一方法是在您的方法上放置DebuggerNonUserCodeAttribute。

这将确保标记方法中的任何exception都不会导致exception中断。

这里有很好的解释……

这是一个属性,你对一个方法告诉调试器“与我没什么关系guv’。不是我的代码!”。 容易上当的调试器会相信你,并且不会破坏该方法:使用该属性会使调试器完全跳过该方法,即使你正在逐步执行代码; 发生的exception,然后在方法中捕获将不会进入调试器。 它会将它视为对Framework程序集的调用,如果exception未处理,则会在调用该方法的代码中向调度堆栈报告一级。

代码示例:

public class Foo { [DebuggerNonUserCode] public void MethodThatThrowsException() { ... { } 

条件断点怎么样? 如果我理解正确,只有当某个变量或表达式的值为true时,才能触发断点。

在#if DEBUG中包装try catch块

  public void Foo() { #if DEBUG try #endif { //Code goes here } #if DEBUG catch (Exception e) { //Execption code here } #endif } 

我喜欢将花括号保留在#if之外,以便在调试内部或外部将代码保持在相同的范围内。

如果您仍然想要执行这个操作但需要更多细节,那么您可以这样做

  try { //code } catch (FileNotFoundException e) { //Normal Code here #if DEBUG //More Detail here #endif } #if DEBUG catch (Exception e) { //handel other exceptions here } #endif 

这对你来说已经太晚了,但这是我经常试图教人们保守地使用exception的最大原因。 只有在发生灾难性事件并且合理继续的能力消失时才使用例外。

在调试程序时,我经常翻转First Chance Exceptions(Debug – > Exceptions)来调试应用程序。 如果发生了很多例外情况,很难找到出现“错误”的地方。

此外,它导致一些反模式,如臭名昭着的“抓住投掷”,并混淆真正的问题。 有关详细信息,请参阅我在该主题上发表的博文 。

就您的问题而言,您可以仅针对特定类型的exception启用第一次机会调试。 除非其他例外属于同一类型,否则这应该可以正常工作。

您也可以使用断言而不是断点。 例如,如果您只想在第二次调用该函数时在循环的第5次迭代中断点,则可以执行以下操作:

 bool breakLoop = false; ... Work(); // Will not break on 5th iteration. breakLoop = true; Work(); // Will break on 5th iteration. ... public void Work() { for(int i=0 ; i < 10 ; i++) { Debug.Assert (!(breakLoop && i == 5)); ... } } 

所以在第一次调用Work时,虽然breakLoop为false,但循环将在没有断言的情况下运行,第二次循环将会中断。