我有一个带有日志文件的Windows服务来编写捕获的任何异常。在使用LINQ的简单foreach中,我得到了经典的例外:
Object reference not set to an instance of an object.
但是,当我在本地运行代码时,通过“冻结”Windows服务代码并仅通过Main函数运行代码,我似乎无法复制此问题。堆栈跟踪表示导致问题的行是142。
var newTickets = tickets
.Where(t => t != null)
.Where(t => (DateTime)t.LastActivityDate >= lastAutoTaskSync);
foreach(Ticket ticket in newTickets) //Line 142
奇怪的是,通过添加以下几行,我已经检查了所有可能的事情:
var newTickets = tickets
.Where(t => t != null)
.Where(t => (DateTime)t.LastActivityDate >= lastAutoTaskSync);
if (newTickets == null) throw new Exception("newTickets is null");
if (tickets == null) throw new Exception("tickets is null");
if (lastAutoTaskSync == null) throw new Exception("date is null");
foreach (Ticket ticket in newTickets)
同样,同一行引发同样的异常。
我可能遗失了什么,或者可能导致此异常的事情吗?我认为它可能是LINQ中的代码,例如LastActivityDate
为空,但如果是这样的话,那肯定会抛出异常的行,而不是foreach本身?
要添加,代码会在大约50%的时间内运行,在foreach
内运行时没有任何问题。例如,服务日志指示循环中的代码运行3或4次,然后异常命中第5次。
答案 0 :(得分:1)
堆栈跟踪报告错误的行号,导致我相信LINQ查询导致异常。实际上,异常是在foreach循环中抛出的,几行向下,我尝试访问Ticket
属性中的对象,该对象为null。
经验教训,不要完全相信并完全依赖堆栈跟踪!