2011-07-05 56 views
3

gyus中引發的異常!假設我有這樣簡單的LINQ表達式如何處理在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() 
     } 

如果字符串不能按照指定的格式解析mask - 我得到FormatException。在調試器中,我可以在變量「res」的結果視圖中瞭解它。實時我收到空集。

可能有很多不同的例外情況,可能會在執行LINQ期間發生。我怎麼能抓住和處理它們?嘗試catch塊在這裏不起作用,因爲異常在我看來不會被提出。

回答

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時使用的rqResult.Row["MatchDate"]值是用來避免空

+1

TryParseExact是更好的辦法來避免該異常 – VMAtm

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;