20

我在一个相当大的遗留代码库上工作。因为它并不总是保持最佳状态,所以有时会从控制流中使用异常,或者出于各种其他原因。有时它几乎是不可避免的。例如,除了将文件作为图像传入并查看它是否不会引发异常之外,您还如何检查文件是否是有效的 .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电话。这充其量是烦人的,而且很容易出错

4

3 回答 3

1

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

于 2013-01-08T16:34:06.900 回答
1

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

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

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

于 2013-01-09T12:39:27.237 回答
0

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

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

于 2013-01-09T12:27:33.497 回答