2014-12-19 4 views
5

У меня есть этот кусок кода:я не могу поймать исключение

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).

+5

Вы должны добавить try/catch внутри foreach. См. Эту статью [MSDN] (http://msdn.microsoft.com/en-us/library/dd460695%28v=vs.110%29.aspx) –

+0

Вы также можете вызвать 'EnumerateFiles' перед выражением LINQ и обернуть это позвоните в try/catch. – helrich

+0

Предположим, что в параллельном цикле один файл генерирует исключение, а другой - его собственный. Как вы можете иметь дело с двумя «параллельными» исключениями в одном блоке try-catch? –

ответ

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) { ... } 
}); 
+0

Он не работает. У меня такое же исключение, что я не могу поймать – J19

-1

Если вы хотите, чтобы поймать каталог не найден исключение, вы можете добавить эти две линии

catch (DirectoryNotFoundException dnfe) 
{ 
    throw dnfe; 
} 
+0

Хотя вам определенно лучше поймать конкретное исключение, которое вас интересует, в этом случае OP не может поймать какие-либо исключения, в которых они хотят - добавив это к код не поможет. –

-1

Лучший способ поймать любые исключения, которые могут быть брошенным в то время как в цикле должно использоваться System.AggregateException. Это связано с тем, что любое исключение, созданное в любом потоке в цикле, может также вызвать другие потоки для исключения исключений.

Смежные вопросы