Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在LINQ投影中捕获异常吗?_C#_Linq_Exception - Fatal编程技术网

C# 我可以在LINQ投影中捕获异常吗?

C# 我可以在LINQ投影中捕获异常吗?,c#,linq,exception,C#,Linq,Exception,假设我编写一个linq查询,以获取有关C驱动器上隐藏文件的信息: 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.GetAccess

假设我编写一个linq查询,以获取有关C驱动器上隐藏文件的信息:

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#编程风格中实现这一点(或者如果可能的话)

从概念上讲,我想要某种“continue”语句,可以放在围绕LINQ查询的catch块体中

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

由于LINQ的惰性,当您开始使用迭代器时,而不是在构建查询时,您可能需要
try/catch

var q3 = ...

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

}
只返回一个
IEnumerable
,在开始迭代之前不会进行任何计算


更新:

为了避免在抛出异常时中断循环,可以执行以下操作:

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
            }
        }
    }
}

等等,这不是继续foreach循环的方法:(@Gabriel,请参阅我的更新,以便在抛出异常的情况下安全地继续循环。只是好奇-您在此处使用using块是一种样式选择还是它提供函数?@Gabriel,using块始终提供函数=>它确保始终调用一次性资源的Dispose方法以释放相关资源。