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


152

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

这是我的代码:

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

这是一些证据

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


5
@TimSchmelter图片正在调试中,黄色高亮显示代码所在的位置
George

5
我刚刚创建了一个空白的核心控制台应用程序,只需粘贴你的代码进入Main并....惊喜,norepro。您可能会误会或者错过了一些重要细节。
Jamiec '17

16
这是async偶然的方法吗?因为它看起来类似于stackoverflow.com/questions/42528458/…–
马修·沃森

7
@乔治:仍然没有证据,因为您可能会使用旧的调试符号。在调试模式下重新编译,然后重新启动。
蒂姆·施密特

4
@TimSchmelter 我已经重新编译,清理,重新打开了该项目,尝试了不同的if方式,但是仍然相同
George

Answers:


176

看来这是async方法中的错误,实际上并没有执行代码,而是调试器步入with throw语句行。如果throwif这些语句之前的语句之前有一些代码行被忽略,则调试器将移至with throw语句所在的行。

另外,如果您不使用变量- if (false)if (true == false)然后调试器使用正确的代码行-请使用大括号。

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

另外,请参阅类似的问题- 异步方法中的条件检查

编辑(2017/10/06):

使用.Net Framework 4.7在VS 2017 15.3.5中无法重现该问题。似乎VS团队已解决此问题。


20
谢谢,不知道这是调试器中的错误,我可能会发疯。
乔治

121
调试器中的错误?太元了。:)(唱歌之前我从来没有像这样的元错误...
Simba

3
@George,我希望您不要介意,我已经拿了您的示例并使用它创建了一个控制台应用程序,并将其附加到Roma链接到的VS问题上。
黑曜石凤凰城

5
@Simba:告诉我,您从未使用调试器进行自我调试。
约书亚

3
嗯 似乎该错误可能在编译器生成的调试信息中,而不是在调试器本身中。我将等待MS确认连接错误,然后投票赞成或反对。
Adrian McCarthy

10

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

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

因此,它没有直接跳转到该方法的最后一条指令,而是执行了两次跳转,我相信第二次无条件跳转被错误地识别为代码if块内部代码的一部分。

因此,我推测此错误可能与JIT编译器有关。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.