如何处理linq中引发的异常

时间:2011-07-05 06:52:52

标签: c# linq exception-handling

gyus!假设我有这么简单的LINQ表达式

IEnumerable<StopListMatchViewModel> res =
    from rqResult in MatchesList
    select new StopListMatchViewModel
        (
        )
        {
            MatchDate = DateTime.ParseExact(rqResult.Row["MatchDate"].ToString(), "dd.MM.yyyy HH:m:ss", fmtInfo),
            Remark = rqResult.Row["Remark"].ToString()
        }

如果无法根据指定的格式掩码解析字符串 - 我得到FormatException。在调试器中,我可以在变量“res”的结果视图中了解它。实时我得到空集合。

在执行LINQ期间可能会出现许多不同异常的例子。我怎么能抓住并处理它们?尝试catch块在这里不起作用,因为异常在我看来不会被提出。

2 个答案:

答案 0 :(得分:2)

由于延迟执行,在您评估查询之前不会执行查询,例如通过使用.ToList()方法。只会在那个时候抛出异常。

要避免此问题,您需要修改查询。如下所示

IEnumerable<StopListMatchViewModel> res =
    from rqResult in MatchesList
    select new StopListMatchViewModel
    {
        MatchDate = DateTime.ParseExact(
            ((rqResult.Row["MatchDate"]==null) ?
                rqResult.Row["MatchDate"] : DateTime.MinValue).ToString(), "dd.MM.yyyy HH:m:ss", fmtInfo),
        Remark = rqResult.Row["Remark"].ToString()
    }

注意:DateTime.MinValue的值为null时使用rqResult.Row["MatchDate"],用于避免null

答案 1 :(得分:0)

使用TryParseExact方法避免不需要的例外 我不明白为什么你不能使用try-catch块?你真的觉得它没有被提出来吗​​? 您还应该检查数据库中的NULL值:

MatchDate = Convert.IsDBNull (rqResult.Row["MatchDate"]) ?   
  DateTime.MinValue : 
  DateTime.ParseExact(rqResult.Row["MatchDate"].ToString(),
    "dd.MM.yyyy HH:m:ss", 
    fmtInfo),
Remark = (string)rqResult.Row["Remark"] ?? String.EmptyString;