【问题标题】:How to NOT breaking on an exception?如何不打破异常?
【发布时间】:2013-03-27 20:14:08
【问题描述】:

我有这样的东西:

try
{
    instance.SometimesThrowAnUnavoidableException(); // Visual Studio pauses the execution here due to the CustomException and I want to prevent that.
}
catch (CustomException exc)
{
    // Handle an exception and go on.
}

anotherObject.AlsoThrowsCustomException(); // Here I want VS to catch the CustomException.

在代码的另一部分中,我遇到了多次引发 CustomException 的情况。我想强制 Visual Studio 停止在 instance.SometimesThrowAnUnavoidableException() 行上中断,因为它掩盖了我有兴趣在 CustomException 上中断的其他地方的视图。

我尝试了 DebuggerNonUserCode,但目的不同。

如何禁止 Visual Studio 仅在特定方法中捕获特定异常?

【问题讨论】:

  • 什么版本的 Visual Studio?在 2012 年,您只需取消勾选“中断此类异常”
  • AFAIK 这是不可能的 - 您可以为特定的异常类型打开和关闭中断,但不能为特定的代码部分。
  • 不要使用异常来控制流,当你必须调试它们时你会后悔。以 DateTime.TryParse() 方法为例,该方法旨在避免在可能发生异常的地方出现异常。
  • 我会在另一个类中验证它。
  • 我会和那个班的程序员谈谈。而不是互联网上的一些随机的人。

标签: c# visual-studio exception exception-handling


【解决方案1】:

如果您希望 Visual Studio 停止中断某个类型的所有异常,则必须从“异常”窗口配置行为。

完整的说明是here,但要点是转到“调试”菜单并选择异常,然后取消选中您不希望调试器中断的项目。

我认为没有办法避免使用这种技术的特定方法,但也许更好的问题是“为什么会抛出异常?”

您可以添加一组#IF DEBUG 预处理器指令以避免运行有问题的代码部分。

【讨论】:

  • 在我想避免中断的行中,在某些情况下我无法避免该异常。有时必须抛出该异常并且它是有效的(并且它是第三方代码)。但在其他情况下,如果发生此类异常,我想中断并解决问题。问题是,在某些应用程序状态下,不需要的行多次中断,我不想每次都停下来单击继续,我无法禁用该异常类型,因为它会在无效的地方丢失我需要调查。
  • 阅读最后一点。您可以在调试时禁用它,当代码在发布模式下编译时仍然会抛出它。
  • 我无法禁用它。它必须正在运行并引发异常,但不应暂停执行。
【解决方案2】:

在 Visual Studio 中,转到 debug->exceptions 并通过取消选中相应的复选框来关闭 CustomException 的中断,然后在代码中(可能在 catch 语句中)在您实际想要的位置设置断点继续。

【讨论】:

  • 我更喜欢在异常之后进行堆栈遍历,但你当然是对的。
  • @yBee 你仍然可以在调用堆栈窗口中查看调用堆栈,如果这就是你的意思的话。
  • 为了查看调用堆栈,我首先必须在有意义的地方休息。 Visual Studio 经常在不适当的地方中断干扰我想要停止的地方。
【解决方案3】:

您可以通过在方法前放置DebuggerStepThrough Attribute 来完全禁用步进。 由于这会禁用整个方法的单步执行,因此您可以将 try-catch 隔离为单独的一个以进行调试。

我没有测试,但是当抛出异常时,它甚至不应该中断该方法。试试看;-)

另见this SO thread

【讨论】:

  • 不幸的是它不起作用。 Visual Studio 仍然停在该行。
【解决方案4】:

您不能简单地禁止 Visual Studio 停止在特定的代码位置。您只能在抛出特定类型的异常时阻止它停止,但这会影响发生此类异常的所有地方。

其实你可以按照280Z28的建议实现custom solution

【讨论】:

    【解决方案5】:

    您可以使用自定义代码分两步执行此操作。

    1. CustomException 异常禁用自动中断。
    2. 为您的应用程序添加AppDomain.FirstChanceException 事件的处理程序。在处理程序中,如果实际异常是 CustomException,请检查调用堆栈以查看您是否真的要中断。
    3. 使用 Debugger.Break(); 使 Visual Studio 停止。

    下面是一些示例代码:

    private void ListenForEvents()
    {
        AppDomain.CurrentDomain.FirstChanceException += HandleFirstChanceException;
    }
    
    private void HandleFirstChanceException(object sender, FirstChanceExceptionEventArgs e)
    {
        Exception ex = e.Exception as CustomException;
        if (ex == null)
            return;
    
        // option 1
        if (ex.TargetSite.Name == "SometimesThrowAnUnavoidableException")
            return;
    
        // option 2
        if (ex.StackTrace.Contains("SometimesThrowAnUnavoidableException"))
            return;
    
        // examine ex if you hit this line
        Debugger.Break();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2010-09-15
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      相关资源
      最近更新 更多