我不能抓住例外

本文关键字:不能 | 更新日期: 2023-09-27 18:34:47

我有这段代码:

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

当我在Directory.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) { ... } 
});

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

如果要

捕获找不到目录异常,可以添加两行

catch (DirectoryNotFoundException dnfe)
{
  throw dnfe;
}