2011-04-17 57 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