如何解决我可以在LINQ投影中捕获异常吗?
| 假设我写了一个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)
{
}
Directory.EnumerateFiles仅返回一个IEnumerable<string>
,并且直到开始对其进行迭代之前都不会进行评估。
更新:
为了避免在引发异常时跳出循环,您可以执行以下操作:
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
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。