无法解释的NullReferenceException,仅在生产中发生

时间:2017-07-17 15:03:41

标签: c# .net

我们有一个运行的ASP.NET网站,它会抛出一个NullReference异常以及一个堆栈跟踪和一个根本不可能的行号。我自己也不能做头或尾。

它说:

Exception at ReportService.GetReport(String reportType) in ReportService.cs:line 1458

这很有趣,因为就是这一行:

var exports = new List<ReportExport>();

由于(非常短的)堆栈跟踪,我可以看到错误是在GetReport函数中触发而不是在“GetAllUsers”或“GetAllUsersWithFilter”函数中触发,因为我会在我的e-中收到不同的错误消息邮箱或我会看到它在堆栈跟踪中弹出。

所以我怀疑行号是错误的,在这种情况下只有另一种可能性,就是这一行:

  foreach (var userProfile in users) {
      exports.Add(CreateUserProfile(userProfile));
  }

users怎么可能为空呢?

完整(尽管简化)代码就在这里:

public function IList<ReportExport> GetReport(string reportType) {
   try {
       IQueryable<UserProfile> users = null;
       switch (reportType) {
           case "abc" : 
             users = GetAllUsersWithFilter();
             break;
           case default:
            users = GetAllUsers();
            break;
      }

      var exports = new List<ReportExport>();
      foreach (var userProfile in users) {
          exports.Add(CreateUserProfile(userProfile));
      }
  } catch (Exception ex) {
    SendErrorMail("GetReport has failed", ex); /* I receive this error mail */
  }

function IQueryable<UserProfile> GetAllUsers() {
    try {
      return dbContext.Users.Where(x => x.IsRegistered == true);
    } catch (Exception ex) {
       SendErrorMail("GetAllUsers", ex); /* I don't receive this e-mail */
       return null;
    }
}

function IQueryable<UserProfile> GetAllUsersWithFilter() {
    try {
       return GetAllUsers().Where(x => x.ExtraFilter == true);
    } catch (Exception ex) {
       SendErrorMail("GetAllUsersWithFilter", ex); /* I don't receive this e-mail */
    }
  }

  function int GetNumberOfSessions(int userId) {
     try {
         return dbContext.Sessions.Count(x => x.UserId == userId);
     } catch (Exception ex) {
         SendErrorMail("GetNumberOfSessions", ex); /* I don't receive this e-mail */
     }
  }

  function ReportExport CreateUserExport(UserProfile user) {
     try {
         var cnt = GetNumberOfSessions(user.Id);
         return new ReportExport() {
           UserId = user.Id,
           NumberOfSessions = cnt
         }
     } catch (Exception ex) {
       SendErrorMail(("CreateUserExport", ex);
     } 
  }

1 个答案:

答案 0 :(得分:0)

如果您正在投入生产,那么您可能会在启用优化的情况下运行 - 因此行号将是错误的。

But how could users ever be null?

但是你正在捕获Exception然后返回null。您依赖于返回数据 - 这可能不是GetAllUsers中的情况。

function IQueryable<UserProfile> GetAllUsers() {
    try {
      return dbContext.Users.Where(x => x.IsRegistered == true);
    } catch (Exception ex) {
       SendErrorMail("GetAllUsers", ex); /* I don't receive this e-mail */
       return null;
    }
}