使用linq查询处理异常

时间:2012-06-22 18:45:42

标签: c# linq exception-handling

如何处理linq查询中的异常?例如,如果我有以下查询:

var query = (from d in GetLHDb().daily_average
             where d.findnsave_site_id == fnsID 
                   && d.test_path_id == pathId 
                   && d.date > nTimesDays 
                   && d.date <= yesterday
             select new
             {
                 loadtime = d.loadtime,
                 created_at = d.date
             }).ToArray();

例如,我如何处理查询中的null异常?我在网上搜索过,但很多都是用于VB的。

3 个答案:

答案 0 :(得分:1)

try
{
    var query = (from d in GetLHDb().daily_average
    where d.findnsave_site_id == fnsID && d.test_path_id == pathId && d.date > nTimesDays && d.date <= yesterday
    select new { loadtime = d.loadtime, created_at = d.date }).ToArray();
}
catch (NullReferenceException e)
{
    ReportError();
}

答案 1 :(得分:1)

在您的情况下,就像您在代码中的任何其他位置一样。将.ToArray()包裹在try/catch块中。虽然在你的情况下我会更加防守并正确处理空值。

try
{
    var query = (from d in GetLHDb().daily_average
    where d.findnsave_site_id == fnsID && d.test_path_id == pathId && d.date >                           nTimesDays && d.date <= yesterday
select new { loadtime = d.loadtime, created_at = d.date }).ToArray();
}
catch (Exception)
{
  //do what you need to
}

答案 2 :(得分:1)

在您的示例中,我看到三个可能出现空引用异常的地方,那就是当GetLHDB为空时访问GetLHDb().daily_average,尝试枚举daily_average为空,或者当它为空时尝试访问d内的字段(我甚至不确定这个字段是否会发生)。

我建议将GetLHDb()的结果存储到局部变量(例如,lhdb),然后对其进行空值检查。如果它不为null,请执行nll check-on lhdb.daily_average。如果不是null,请继续查询。

更新:此外,如果d为空,您可以使用d != null启动您的where子句。

var lhdb = GetLHDb();
if(lhdb != null && lhdb.daily_average != null)
{
    var query = (from d in lhdb.daily_average
                 where d != null // If d can't be null, remove this
                       && d.findnsave_site_id == fnsID 
                       && d.test_path_id == pathId 
                       && d.date > nTimesDays 
                       && d.date <= yesterday
                 select new
                 {
                     loadtime = d.loadtime,
                     created_at = d.date
                 }).ToArray();

    // Process the results
}