如果(false == true)在抛出异常时执行阻止

时间:2017-03-02 10:37:50

标签: c# .net visual-studio .net-core

我有一个相当奇怪的问题正在发生。

这是我的代码

private async Task BreakExpectedLogic()
{
    bool test = false;
    if (test == true)
    {
        Console.WriteLine("Hello!");
        throw new Exception("BAD HASH!");
    }
}

看起来非常简单,不应该点击Console.WriteLinethrow。 出于某种原因,它总是达到throw

如果我将throw移动到自己的方法中,那么它可以正常工作。我的问题是它如何忽略if块并点击throw new Exception

nice properties of UTF-8

编辑1 我已更新我的代码以包含签名,我删除了与此问题无关的所有内容并运行它,它仍然会发生

2 个答案:

答案 0 :(得分:172)

似乎是async方法中的错误,代码不是实际执行但调试程序步入throw语句行。如果throw语句中的if语句之前有一些代码行被忽略,则调试器会将步骤到throw语句的行。

此外,如果您不使用变量 - if (false)if (true == false),那么调试器将执行正确的代码行 - 到结束大括号。

@Matthew Watson 已将此错误发布到Visual Studio团队(链接现在不可用)。

另外,请参阅类似问题 - Condition check in async method

编辑(2017/10/06):

使用.Net Framework 4.7无法在VS 2017 15.3.5中复制问题。似乎VS团队已经解决了这个问题。

答案 1 :(得分:8)

只是答案的附录,我最近遇到了同样的问题,并查看了调试器中的实际x86代码,它是以这样一种奇怪的方式生成的(简化):

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret

因此,不是直接跳转到方法的最后一条指令,而是双跳,我认为第二次无条件跳转被错误地识别为if块内代码的一部分。

所以我推测这个bug可能与JIT编译器有关。