内部异常会导致逻辑异常行为

时间:2015-07-09 18:48:51

标签: c# exception azure

请耐心等待,因为这可能很难解释(但不要担心,我的屏幕录像只是为了这个!)。

我们正在运行一个Azure工作进程来处理来自队列的消息。 Azure接收消息并开始处理逻辑。

在执行期间,我们转到数据库并获取日志记录(使用EF,而不是懒惰,因为它返回一个完整的对象)。下一步是验证对象不为空。

var log = Repo.Find(fileId);
if (log == null)
{

该对象不为null。表达式的计算结果为false。将鼠标悬停在Visual Studio中的==上会显示表达式为false。在立即窗口中运行此代码将显示评估为false。代码不应该进入if块。

注意我说“不应该”。

在if块中我们抛出一个异常。出于某种原因,即使表达式求值为false,也会抛出异常。无论什么类型的异常都没关系,因为我尝试了两种不同的类型。

最后一点是我从if块中删除了异常并执行了一些其他逻辑,按预期跳过该块。

因此,以下功能符合预期:

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)。

1 个答案:

答案 0 :(得分:0)

你的代码是正确的,你不应该得到例外,但是当有人在Visual Studio for AOP(PostSharp等)中使用第三方工具时,通常会发生这样的事情。你能检查一下吗?如果您使用它,尝试删除属性并再次运行这段代码,我认为问题将消失。