我有一个这个可能的错误的简单洁净室示例。
static void Main(string[] args)
{
bool MyFalse = false;
if (MyFalse)
{
throw new Exception();
}
try
{
int i = 0;
}
catch (Exception e)
{
Console.Write(e);
}
Console.Read();
}
如果在 x64 或 AnyCPU 中编译(在 VS2012 中将首选 32 位设置为 false 时),如果您在 if 块中放置断点,它总是会被命中。
我们在 VS2012、VS2010 和 VS2008 中尝试过,它们在 64 位编译时都触发了 if 块,但在 32 位中它不会触发 if 块。
我们查看了 32 位和 64 位版本的 IL,它们看起来相同。
我们在生产代码中发现了这一点,因为 if 块正在运行并且无论布尔变量的值是什么都会抛出异常,尽管在简单的示例中我们似乎无法抛出异常,它发生在生产代码中。
由于它发生在生产代码中,因此不仅仅是调试器问题。
非常奇怪的行为,但似乎并没有在 if 块中实际运行任何代码。开发人员假设这是他所看到的例外情况,因此开枪了。
(所有调试都处于调试模式 - 生产正在发布中)
如果 throw 被注释掉 - 没有到达 if 块。