【问题标题】:Is it possible to ignore certain exceptions on certain lines in Visual Studio?是否可以忽略 Visual Studio 中某些行的某些异常?
【发布时间】:2012-12-22 13:43:06
【问题描述】:

我在一个相当大的遗留代码库上工作。因为它并不总是保持最佳状态,所以有时会从控制流中使用异常,或者出于各种其他原因。有时这几乎是不可避免的,例如,除了将文件作为图像传入并查看它是否不会引发异常之外,您还如何检查文件是否是有效的 .ico 图像?

我尽可能地重构这类东西,但很多时候重构成本太高而收效甚微。这些虚假异常在调试时变得非常烦人。我们捕获所有异常以避免我们的程序崩溃,并捕获大多数异常并显示一些对用户更友好的东西。因此,在调试时,如果某段代码抛出了ApplicationException,那么在我们最终找到实际的错误之前,可能会抛出 50 个该类型的异常。大多数情况下,这些虚假异常都集中在代码的单个部分(很多时候是一行)。有什么方法可以让 Visual Studio 忽略从该行抛出的异常,但仍然停止在实际问题的异常上?或者我还能做些什么来帮助防止这种调试挫败感?

为了说明我的问题,想象一下这样的事情:

for(int i=0; i<foo; i++)
{
  try
  {
    FooBar(i); //this function throws NullReferenceException sometimes
  }catch {} //ignore it because we don't care if it failed
}
....
var tmp=Bar as FooType; //this cast fails so tmp is null
tmp.Meh(); //throws exception here. This is a bug, we should've checked for null

如果您想弄清楚 NullReference 在哪里,您基本上可以按住 F5 直到您通过 FooBar 调用。这充其量是烦人的,而且很容易出错

【问题讨论】:

  • 试过ReSharper吗?它不会解决您遇到的所有问题,但它使快速重构变得容易得多。
  • @DarthContinent 拥有它。仍然对这种事情没有帮助
  • 呵呵,由于没有回应,我可能不得不潜入并制作一个 Visual Studio 插件
  • 您可以尝试使用 ReSharper 之类的工具来查找(并在某些情况下删除)这些代码异味。

标签: .net visual-studio debugging exception visual-studio-2012


【解决方案1】:

据我所知,您可以结合多种调试技术来改进重构过程。

如果可能,您可以将(部分)遗留代码放入单独的程序集中。编译优化的并启用"Just my Code" debugging。

对于较小的块(方法),您可以使用DebuggerStepThrough 属性,因此调试器不会在那里中断。 对于您的示例,您可以创建一个方法来执行调用 FooBar 方法的循环并将 [DebuggerStepThrough] 放在新创建的方法上。或者,您可以重构 FooBar 以处理异常并将 [DebuggerStepThrough] 放在上面。

【讨论】:

  • 这并不适用于所有情况。在一种情况下,抛出异常,并处理了 5 次调用(作为控制流的异常的完美示例)。但是,通过使用[DebuggerHidden],我可以让调试器忽略在一种方法中处理的一些异常
  • 请注意,虽然 Just My Code 选项也可用于 C++,但它对异常没有影响,如下所述:msdn.microsoft.com/en-us/library/dn457346.aspx
【解决方案2】:

我开发IntelliDebugger - extension for Visual Studio,方便调试C++/C#代码。包括有例外的工作。 IntelliDebugger 可以过滤不包含在解决方案中的模块抛出的异常(此功能称为“仅从解决方案中中断异常”)。也许这个功能对你有用。

在未来的版本中,我们计划添加更好的过滤器和其他功能来处理异常。如果您有任何功能请求或错误报告,请write to me。这将帮助我们专门为您提供方便的产品。

【讨论】:

  • 这听起来很接近解决问题,但它并没有涵盖我的所有情况。实际上,我现在正以这个问题为借口尝试编写 Visual Studio 扩展 :)
  • 我标记了你。这正是我想要的。
  • @Justin tnx,我们将在 12 月发布新版本。如果您有任何问题或建议,请写信给我。
【解决方案3】:

您可以调整中断发生的异常类型。 请参阅菜单中的调试 -> 异常 http://msdn.microsoft.com/en-us/library/d14azbfh(v=vs.80).aspx

【讨论】:

  • 看我的例子。我可以忽略 NullReference 异常,或者错过错误,或者我可以继续处理虚假异常。这不够精细
  • 您可以使用 Debugger.Break() 手动中断您需要的异常。
  • 嗯,这就是问题所在。我通常不知道我需要关注的异常到底在哪里,我只知道我不需要关注这些抛出然后立即捕获并忽略的异常
猜你喜欢
  • 1970-01-01
  • 2017-04-19
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2018-12-06
  • 2017-02-22
相关资源
最近更新 更多