C# 我能';我看不出有什么例外

C# 我能';我看不出有什么例外,c#,.net,C#,.net,我有一段代码: try { var files = from folder in paths from file in Directory.EnumerateFiles(path, pattern, searchOption) select new Foo() { folder = folder, fileName = file }; Parallel.ForEach(files, new ParallelOpti

我有一段代码:

try
{
    var files = from folder in paths
                from file in Directory.EnumerateFiles(path, pattern, searchOption)
                select new Foo() { folder = folder, fileName = file };

    Parallel.ForEach(files, new ParallelOptions { MaxDegreeOfParallelism = _maxDegreeOfParallelism }, currentFile =>
    {
        DoWork(currentFile);
    });
}
catch (Exception ex)
{

}
当我在
目录.EnumerateFiles
中遇到异常时,我无法在这段代码中捕获该异常。调用此代码段的方法捕获异常


在调试模式下,Visual Studio会从Visual Studio捕获异常(例如,
DirectoryNotFoundException
)。

问题在于您在此处异步调用代码:

Parallel.ForEach(files, new ParallelOptions { MaxDegreeOfParallelism = _maxDegreeOfParallelism }, currentFile =>
{
    DoWork(currentFile);
});
这使得调用在单独的线程上进行,而不是在主线程上进行

像这样使用
try&catch
块:

Parallel.ForEach(files, new ParallelOptions { MaxDegreeOfParallelism = _maxDegreeOfParallelism }, currentFile =>
{
    try
    { 
         DoWork(currentFile);
    }
    catch (Exception ex) { ... } 
});

如果要捕获目录未找到异常,可以添加两行

catch (DirectoryNotFoundException dnfe)
{
  throw dnfe;
}

捕获循环中可能引发的任何异常的最佳方法是使用System.AggregateException。这是因为在循环中的任何一个线程中抛出的任何异常都可能导致其他线程也抛出异常。

您必须在foreach中添加try/catch。看到这一点,您还可以在LINQ表达式之前调用
EnumerateFiles
,并将该调用包装在try/catch中。假设在并行循环中,一个文件抛出一个异常,另一个文件抛出自己的异常。如何在一个try-catch块中处理两个“并行”异常?可以调用
files.ToList()
并行
之前,然后你的捕获就会触发。只是想知道你是否应该将
文件夹
传递到
目录。枚举文件
而不是
路径
?虽然捕获你感兴趣的特定异常肯定会更好,在这种情况下,OP无法捕获任何他们想要捕获的异常-将其添加到代码中不会有帮助。