问题描述
我有一个正在发生的异常,但我不太明白它是如何发生的。我将不胜感激任何有关如何修复它的提示,或有关如何更好地理解错误发生原因的建议。
背景信息
- 错误已记录到我们的错误数据库中,很遗憾,我自己无法重现该错误。
- 此错误发生在一个 24/7 全天候运行的仪表板应用程序中,它尝试每分钟刷新一次数据。因此,此错误在过去几周内多次发生。虽然这并不是一个紧迫的问题,因为仪表板很快就会重新尝试刷新数据,但我一直无法修复它让我感到困扰。
这是记录的异常消息:Object reference not set to an instance of an object.
查了一下,这似乎是由 NullReferenceException 引起的。但是,异常发生在 Enumerable.ToDictionary()
中,根据文档,它只会抛出 ArgumentNullException。因此,我对正在发生的错误、发生的方式和原因感到困惑。
这是堆栈跟踪的相关部分。
at PackerVM.<>c.<GetData>b__32_3(OrderDetail orderDetail) in PackerVM.cs:line 72
at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source,Func`2 keySelector,Func`2 elementSelector,IEqualityComparer`1 comparer)
at System.Linq.Enumerable.ToDictionary[TSource,Func`2 elementSelector)
at PackerVM.GetData() in PackerVM.cs:line 65
_orderDetails = miiDb.OrderDetails // OrderDetails is a DbSet<OrderDetail>
.Where(orderDetail => orderDetail.Department == "MOLDING" && orderDetail.Location != null)
.GroupBy(orderDetail => orderDetail.Location)
.Select(orderDetails => orderDetails.OrderByDescending(w => w.ReleaseState)
.ThenBy(orderDetail => orderDetail.Sequence)
.ThenBy(orderDetail => orderDetail.PlannedStart)
.FirstOrDefault())
.ToDictionary(orderDetail => orderDetail.Location,orderDetail => new PackerPressData()
{
Location = orderDetail.Location,Machinestatus = orderDetail.Machinestatus,ReleaseState = orderDetail.ReleaseState,Tool = orderDetail.Tool,PartNumber = orderDetail.PartNumber
});
这里是堆栈跟踪中行号的一些额外细节:
第 72 行引用了这部分代码:.ToDictionary(orderDetail => orderDetail.Location,orderDetail => new PackerPressData()
第 65 行引用了这部分代码:_orderDetails = miiDb.OrderDetails
我的进步
错误发生在 Enumerable.ToDictionary
,所以我首先查找 Microsoft docs for Enumerable.ToDictionary,这就是我确定错误是 ArgumentNullException 的方式。如前所述,该消息似乎对应于 NullReferenceException,导致我感到困惑。
这基本上是我卡住的地方,因为我无法重现该问题。正如我所提到的,数据经常更新,所以我的测试可能运行时间不够长,无法再次遇到它。
我尝试在本地测试时手动添加检查,以查看 .Select()
语句之前的 .ToDictionary()
语句生成的任何 OrderDetails 是否为空,但没有为空。
我唯一能想到的是在 .Where(orderDetail => orderDetail != null)
和 .Select()
语句之间添加一个 Where 子句:.ToDictionary()
,但我不相信这会解决问题的根本原因,因为我不完全理解此时的 OrderDetail 是如何首先为 null 的。
TLDR
Enumerable.ToDictionary() 似乎产生了 ArgumentNullException,但保存到我们的 Error 数据库的错误消息对应于 NullReferenceException。此外,我不明白在代码中用于生成 Dictionary 对象的对象如何可以为 null。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)