【问题标题】:How do you prevent VS debugger from showing exception on every await?如何防止 VS 调试器在每次等待时显示异常?
【发布时间】:2018-10-29 15:14:30
【问题描述】:

在包含多个 await 语句的调用堆栈中,当抛出异常时,调试器会在每个 await 语句处不断显示错误。我想知道是否有办法让调试器只显示引发异常的初始位置,而不是一直等待。

【问题讨论】:

  • 我怀疑它在真正的异常点没有失败的原因是它实际上是一个未捕获的异常。如果您将try/catch 放在awaits 的根附近,那么您可能会获得更多/相关信息。
  • 这没有多大意义。在异步代码中获取异常是非常痛苦的。您会考虑在抛出异常时强制调试器停止,以便解决问题。很好,问题已解决,但别忘了再次禁用它。
  • @HansPassant,不知道我是否理解,我们有抛出异常的代码,但是更高级别的代码可能会决定一个特定的异常是可以的,所以它通过多层异步方法最终被“处理” "(忽略)。在我们的例子中,我们尝试通过名称解析一个对象,但如果我们没有找到它,那可能没问题,这取决于它是在需要时发生,还是在可能需要之前完成。所以可能有来自该代码的异常,但也可能有来自其他地方的异常,只是在每次等待时停止并没有增加价值,我可以看到。

标签: c# visual-studio visual-studio-2017 visual-studio-debugging


【解决方案1】:

System.Diagnostics.DebuggerHidden 属性怎么样?该属性用于对调试器隐藏方法或属性,同时防止调试器拦截异常。

[System.Diagnostics.DebuggerHidden]
private static void SecretRun(IEnumerable<int> ints)
{
   foreach (var i in ints)
   {
       try
       {
           if (i < 50) Console.WriteLine("next" + i);
           else throw new Exception("some exception");
       }
       catch
       {
           // Ignored
       }
    }
}

缺点:您将无法调试到带有DebuggerHidden 属性标记的方法。

要使用此属性,您需要在Tools &gt; Options &gt; Debugging &gt; General

勾选“仅启用我的代码”

【讨论】:

  • 这样做的问题是你不得不在太多的方法中忽略异常。可能是为了解决@Alex 的问题,需要升级 Visual Studio,因为 VS 仅根据此属性和异常类型过滤要停止的异常。但是要执行 OP 想要的操作,它需要根据异常是否已经停止进行过滤。
【解决方案2】:

我不确定您提到的内容是否有设置。但是,如果您尝试捕获/调试某个特定错误,那么您可以更改您的异常设置(ctrl + alt + E)并勾选“通用语言运行时异常”。这将打破最初的错误。然后只需右键单击,完成后恢复默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多