【问题标题】:If (false == true) executes block when throwing exception is insideif (false == true) 在内部抛出异常时执行块
【发布时间】:2017-07-22 00:55:07
【问题描述】:

我遇到了一个相当奇怪的问题。

这是我的代码:

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:我已更新我的代码以包含签名,我已删除与此问题无关的所有内容并运行它,它仍然会发生。

【问题讨论】:

  • @TimSchmelter 图片正在调试中,黄色高亮是代码所在的位置
  • 我刚刚创建了一个空白的核心控制台应用程序,只将您的代码粘贴到了Main 和....惊喜,norepro。要么你弄错了,要么你错过了一些重要的细节。
  • 这是在async 方法中吗?因为它看起来类似于stackoverflow.com/questions/42528458/…
  • @George:仍然没有证据,因为您可能使用旧的调试符号。在调试模式下重新编译,然后重新开始。
  • @TimSchmelter 我已经重新编译、清理、重新打开项目尝试了不同的 if 方法,但还是一样

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


【解决方案1】:

这似乎是async 方法中的错误,代码没有 实际执行,但调试器会执行throw 语句。如果在if 内的throw 语句之前有一些代码行,这些行将被忽略,调试器 执行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 团队已经解决了这个问题。

【讨论】:

  • 谢谢,如果不知道这是调试器中的一个错误,我可能会发疯。
  • 调试器中的错误?多么元。 :) (唱我以前从来没有像这样的元错误......
  • @George 希望您不要介意,我已经提取了您的示例并使用它创建了一个控制台应用程序,并将其附加到 Roma 已链接到的 VS 问题。
  • @Simba:告诉我你从来没有使用过调试器来调试自己。
  • 嗯。似乎该错误可能在编译器生成的调试信息中,而不是在调试器本身中。在投票赞成或反对之前,我将等待 MS 确认 Connect 错误。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2021-05-11
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多