我们有一个运行的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);
}
}
答案 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;
}
}