C# 我可以在LINQ投影中捕获异常吗?
假设我编写一个linq查询,以获取有关C驱动器上隐藏文件的信息: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
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方法以释放相关资源。