2011-04-17 56 views
1

說我寫LINQ查詢有關我的C驅動器上的隱藏文件信息:我可以在LINQ投影中捕獲異常嗎?

var q2 = 
    from c in Directory.EnumerateFiles("C:\\") 
    where Regex.IsMatch(c, @"^C:\\\.") 
    select c; 

var q3 = 
    from c in q2 
    let info = new 
    { 
     File = c, 
     FileSecurity = File.GetAccessControl(c), 
     FileAttributes = File.GetAttributes(c), 
     CreatedUTC = File.GetCreationTimeUtc(c), 
     AccessedUTC = File.GetLastAccessTimeUtc(c), 
     ModifiedUTC = File.GetLastWriteTimeUtc(c) 
    } 
    select info; 

以上是可能要繼續下去,當一個異常被捕獲邏輯的例子,但我不知道如何讓這種風格的C#編程發生(或者如果可能的話)。

從概念上講,我想要一些可以放在圍繞LINQ查詢的catch塊主體中的「continue」語句。

try 
{ 
    // LINQ QUERY 
} 
catch(Exception ex) 
{ 
    Logger.Log("error..."); 
    continue; 
} 

回答

2

由於LINQ的懶惰天性,當你開始建立查詢時消耗的迭代器,而不是你可能需要try/catch

var q3 = ... 

try 
{ 
    foreach (var item in q3) 
    { 
     ... 
    } 
} 
catch(Exception ex) 
{ 

} 

Directory.EnumerateFiles只返回一個IEnumerable<string>沒有評價反應,直到你開始迭代它。


UPDATE:

爲了避免破環了,如果拋出一個異常,你可以做到以下幾點:

static void Main() 
{ 
    var q = Enumerable.Range(1, 5).Select(x => 
    { 
     if (x % 2 == 0) 
     { 
      throw new Exception(); 
     } 
     return x; 
    }); 

    using (var enumerator = q.GetEnumerator()) 
    { 
     while (true) 
     { 
      try 
      { 
       bool hasNext = enumerator.MoveNext(); 
       if (!hasNext) 
       { 
        break; 
       } 

       Console.WriteLine(enumerator.Current); 
      } 
      catch (Exception ex) 
      { 
       // TODO: do something with the exception here 
      } 
     } 
    } 
} 
+0

等待,這不是一個辦法繼續foreach循環:( – 2011-04-17 16:45:11

+0

@Gabriel,看到我的更新,安全地繼續循環,即使是一個異常也被拋出 – 2011-04-17 17:03:29

+0

謝謝!這是令人印象深刻的:) – 2011-04-17 17:12:48