块内异常导致逻辑异常行为
本文关键字:异常 | 更新日期: 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时,通常会发生这样的事情。你能检查一下吗?如果您使用它,尝试删除属性并再次运行这段代码,我认为问题会消失。