块内异常导致逻辑异常行为

本文关键字:异常 | 更新日期: 2023-09-27 18:02:09

请原谅我,因为这可能很难解释(但不要担心,我有一个屏幕视频!)

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

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

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

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

注意我说了"should not"。

在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);
}

这里有几个视频来证明我没有疯(为了更好地定义正在发生的事情)

显示异常

无一例外地播放视频

为了充分披露,我也用log.Equals(null)尝试了同样的结果。似乎物体的所有变体。= null总是返回相同的结果(false)。

块内异常导致逻辑异常行为

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