如果(false == true)在抛出exception的时候执行block
我有一个相当奇怪的问题正在发生。
这是我的代码
private async Task BreakExpectedLogic() { bool test = false; if (test == true) { Console.WriteLine("Hello!"); throw new Exception("BAD HASH!"); } }
似乎很简单,它不应该击中Console.WriteLine
或throw
。 出于某种原因,它总是在throw
。
如果我把throw
自己的方法,那么它工作正常。 我的问题是,它是如何忽略if
块并击中throw new Exception
编辑1我已经更新我的代码,包括签名,我已经删除了一切与这个问题没有关系,并运行它,它仍然发生
这似乎是async
方法中的错误,代码实际上并没有执行,但debugging程序步骤到与throw
语句的行。 如果在throw
语句之前有一些代码行, if
这些行被忽略,那么debugging程序就会使用throw
语句执行。
另外,如果你不使用variables – if (false)
或者if (true == false)
那么debugging器会跳到正确的代码行 – 到大括号。
此错误已由@Matthew Watson发布到Visual Studio团队 – Visual Studio问题 。
另外,看到类似的问题 – 条件检查asynchronous方法
编辑:
链接现在不可用。 在VS 2017与上次更新问题是不固定的。
编辑(2017/10/06):
问题不能在VS 2017 15.3.5中使用.Net Framework 4.7复制。 好像VS团队已经解决了这个问题。
只是答案的附录,我最近遇到了同样的问题,并在debugging器中查找实际的x86代码,它是以一种奇怪的方式生成的(简化):
// if (...) { 0001: jne 0006 ... 0006: jmp 0007 // } 0007: ret
所以不是直接跳转到方法的最后一条指令,而是跳转,我相信第二个无条件跳转被错误地识别为块内部的代码的一部分。
所以我会推测这个bug可能与JIT编译器有关。