c# - block 内的异常导致逻辑异常行为

标签 c# exception azure

请耐心等待,因为这可能很难解释(但不用担心,我为此准备了截屏视频!)。

我们正在运行一个 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 exception

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/

相关文章:

C# 如何改变标签的字体

c# - 当需要设计模块化架构时,对象转换是现实的必然吗?

c# - 将单元格的数据类型更改为 Double

java - 在应用程序中合并 gnu javaplot

c# - Monorail 无法读取从 jQuery 接收到的 JSON(对象列表)数据

c# - HttpClient - PostAsync 不返回

android - JNI 错误 : Attempt to pass an instance of TangoPointCloudData to onXyzIjAvailable

azure - 多点查询Azure存储服务

azure - Ingress 不适用于 AKS 的应用程序网关入口 Controller (AGIC) 附加组件

java - 如何使用 Appinsight java 配置发送日志的文件夹