我有这段代码:
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
)。
答案 0 :(得分:12)
问题是你在这里异步调用代码:
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) { ... }
});
答案 1 :(得分:-1)
如果要捕获找不到目录的例外,可以添加两行
catch (DirectoryNotFoundException dnfe)
{
throw dnfe;
}
答案 2 :(得分:-1)
捕获循环中可能抛出的任何异常的最佳方法是使用 System.AggregateException 。这是因为在循环中的任何一个线程中抛出的任何异常都可能导致其他线程也抛出异常。