2014-12-19 29 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

您必須在foreach中添加try/catch。看到這個[MSDN文章(http://msdn.microsoft.com/en-us/library/dd460695%28v=vs.110%29.aspx) –

+0

你也可以調用'EnumerateFiles'的LINQ表達和包裝之前請嘗試/趕上。 – helrich

+0

假設在並行循環中,一個文件拋出異常,另一個拋出異常。如何處理單個try-catch塊中的兩個「並行」異常? –

回答

12

的問題是要異步調用此代碼:

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

這使得單獨的線程上,而不是在你的主線程調用。如果你想趕上未發現異常,你可以添加兩行

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

它不起作用。我有同樣的例外,我無法捕捉到 – J19

-1

使用try & catch塊這樣的在循環中被拋出是使用System.AggregateException。這是因爲在循環中的任何一個線程中拋出的任何異常都可能導致其他線程也拋出異常。

+0

儘管捕獲您感興趣的特定異常肯定更好,但在這種情況下,OP無法捕獲任何他們想要的異常 - 將其添加到代碼不會幫助。 –

-1

,最好的辦法目錄來捕獲任何異常,可能

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