【问题标题】:Single-statement VB.NET If-block executed when condition is false? VS 2005 bug?当条件为假时执行单语句VB.NET If-block? VS 2005 错误?
【发布时间】:2012-07-11 04:56:00
【问题描述】:

我想知道你以前是否遇到过这个错误: 在单行 IF 中,条件返回 FALSE,但随后执行继续到 TRUE 部分。

我在这里做错了吗? retrieserrorTolerance 都是 Integer 类型,从下面的屏幕截图中,retries 小于 errorTolerance。但它仍然执行True 部分的语句。

这搞砸了我的程序,所以我所做的就是将Throw New Exception 放在另一行并用End If 关闭,这样就可以了。

我想我的问题是我之前的代码有什么问题?

【问题讨论】:

  • 问题是否存在没有调试? (我有一个..类似的模糊回忆?..所以很久以前发过。)
  • 会不会是多线程或可重入代码问题?
  • 是的,它仍然进入语句的 True 部分,没有放置断点。
  • 旁注:抛出这样的 new 异常是个坏主意 - 您会丢失所有堆栈跟踪信息、任何内部异常、其他有用属性等。要么有一个普通的Throw(将重用现有的异常),或者抛出一个带有特定消息的新异常并将ex作为InnerException传递。
  • 您是否尝试过构建->清洁解决方案,然后是构建->完全重建?

标签: asp.net vb.net debugging if-statement visual-studio-2005


【解决方案1】:

禁用优化以确保代码行与相应的编译指令之间存在清晰的线性对应关系。

如果这是发布模式编译,并且retries 只是一个超出范围的局部变量,编译器可能刚刚优化了将递增值存储在最初保存retries 的寄存器中,但仍然使用它在检查表达式时注册。

为了确认这一点,您将看到retrieserrorTolerance 在发布模式下具有相同的值,而在调试模式下重新编译后retries 的值大一。逐行检查变量。

【讨论】:

  • retries+=1 行就是断点所在的位置...屏幕截图中的活动代码行是 if 之后的throw
  • @Chris - 嗯,谢谢。删除了答案的前半部分不正确,并扩展了我仍然认为有效的第二部分。
  • 嗨。抱歉,我将我的代码重组为常规的 If...End If 块,因为我不能不继续使用我的代码。但是retries 变量是在Sub 的开头声明的,即使retries=1errorTolerance = 10 也会发生这种情况。并且 QuickWatch 仍将表达式显示为 FALSE
  • @DevMonster - 异常真的被抛出了吗? (您可以配置调试器以中断任何 CLR 异常。)
  • 是的。这就是我发现问题的方式 - 它过早地抛出异常,考虑到容错度为 10,Threading.Sleep 为 1 秒,它应该在最少 10 秒后发生,但它几乎是瞬间抛出的。
【解决方案2】:

因为我不能不继续编码,所以我使用了常规的If...End If 块。 Visual Studio 和编译器完美地运行代码,虽然它让我想知道为什么这个表达式阻碍了 VS。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2011-05-27
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多