请耐心等待,因为这可能很难解释(但不用担心,我为此准备了截屏视频!)。
我们正在运行一个 Azure 工作进程,用于处理来自队列的消息。 Azure 接收消息并开始处理逻辑。
在执行过程中,我们访问数据库并获取日志记录(使用 EF,不是懒惰,因为它返回完整的对象)。下一步是验证该对象不为空。
var log = Repo.Find(fileId);
if (log == null)
{
该对象不为空。该表达式的计算结果为 false。将鼠标悬停在 Visual Studio 中的 ==
上会显示表达式为 false。在立即窗口中运行此代码将显示评估结果为假。代码不应进入 if
block 。
注意我说的是“不应该”。
在 if block 内我们抛出异常。由于某种原因,即使表达式的计算结果为 false,也会引发异常。什么类型的异常也并不重要,因为我尝试了两种不同的类型。
最后的转折是,我从 if
block 中删除异常并执行一些其他逻辑,该 block 按预期被跳过。
因此,以下功能符合预期:
var log = Repo.Find(fileId);
if (log == null)
{
var x = 1;
}
但是下面的代码没有:
var log = Repo.Find(fileId);
if (log == null)
{
var exceptionText = "The specified log could not be found.";
throw new ArgumentException(exceptionText);
}
这里有一些截屏视频,可以证明我没有疯(并且可以更好地定义正在发生的事情)
Screencast showing without exception
为了充分披露,我还使用 log.Equals(null)
进行了尝试,得到了相同的结果。似乎 Object.Equals null 的所有变体在这里总是返回相同的结果 (false)。
最佳答案
您的代码是正确的,您不应该遇到异常,但是当有人在 Visual Studio 中使用 AOP 中的第 3 方工具(PostSharp 等)时,通常会发生类似的情况。你能检查一下吗?如果您使用它,请尝试删除属性并再次运行这段代码,我认为问题将会消失。
关于c# - block 内的异常导致逻辑异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31325837/