2014-02-26 131 views
13

現在,我遇到了continue語句的一個主要問題。取決於它是否能夠連接到指定的電子郵件帳戶,FetchUnseenMessages可能會也可能不會返回錯誤。如果FetchUnseenMessages失敗,我希望continue語句返回到foreach語句中的下一個項目(嘗試下一個電子郵件帳戶)。我收到了一些意想不到的結果。我不相信繼續聲明將轉到foreach語句中的下一個項目,但是返回到try語句的開頭並再次嘗試。我一直被困在這一天,我很困難。請幫忙。謝謝,克里斯。C#使用繼續嘗試捕獲的內部捕獲

foreach (string l in lUserName) 
{ 
    try 
    { 
     newMessages = FetchUnseenMessages(sUsername); 
    } 
    catch 
    { 
     continue; 
    } 

    //Other code 
} 
+3

吞嚥這樣所有異常是一個非常糟糕的做法。相反,只能吞下您期望拋出的異常類型。 catch(SomeExceptionTypeType){}' –

+3

l沒有被傳入你的方法。那麼是什麼讓你認爲錯誤的循環正在運行? – Aron

+1

「我不認爲繼續聲明會轉到foreach聲明中的下一個項目」你怎麼知道的?你的代碼甚至不使用'l'。 – dasblinkenlight

回答

23

您可以使用bool可變標誌catch塊設置和執行繼續抓後聲明,如果標誌指示catch塊的執行。

foreach (string l in lUserName) 
{ 
    bool isError = false; //flag would remain flase if no exception occurs 
    try 
    { 
     newMessages = FetchUnseenMessages(); 
    } 
    catch 
    { 
     isError = true; 
    } 
    if(isError) continue; //flag would be true if exception occurs 
    //Other code 
} 

如果繼續語句退出具有相關聯的最後 塊的一個或多個try塊,則控制最初轉移到最內層的try語句的最後塊 。當和如果控制到達最後一個塊的末尾 點,則控制轉移到下一個包圍try語句的最後一個塊 。重複此過程直到 所有干預嘗試語句的最後塊都執行 ,msdn

編輯通過所提供的資料的繼續應該是不正常的,你不應該有任何問題的行爲。您可能還有其他問題,如closure variable in a loop,您可以閱讀更多關於變量關閉here

我做了一個測試來驗證給定的情況,它似乎是正常的。

for (int i = 0; i < 3; i++) 
{ 
    try 
    { 
    Console.WriteLine("Outer loop start"); 
    foreach (int l in new int[] {1,2,3}) 
    {  
     Console.WriteLine("Inner loop start"); 
     try 
     { 
      Console.WriteLine(l); 
      throw new Exception("e"); 
     } 
     catch 
     { 
      Console.WriteLine("In inner catch about to continue"); 
      continue; 
     }   
     Console.WriteLine("Inner loop ends after catch"); 

    } 
    Console.WriteLine("Outer loop end"); 
    } 
    catch 
    { 
     Console.WriteLine("In outer catch"); 
    } 
} 

繼續使用在捕獲的輸出

Outer loop start 
Inner loop start 
1 
In inner catch about to continue 
Inner loop start 
2 
In inner catch about to continue 
Inner loop start 
3 
In inner catch about to continue 
Outer loop end 
Outer loop start 
Inner loop start 
1 
In inner catch about to continue 
Inner loop start 
2 
In inner catch about to continue 
Inner loop start 
3 
In inner catch about to continue 
Outer loop end 
Outer loop start 
Inner loop start 
1 
In inner catch about to continue 
Inner loop start 
2 
In inner catch about to continue 
Inner loop start 
3 
In inner catch about to continue 
Outer loop end 

循環變量外殼

List<Func<int>> actions = new List<Func<int>>(); 
int variable = 0; 
while (variable < 3) 
{ 
    actions.Add(() => variable * variable); 
    ++ variable; 
} 

foreach (var act in actions) 
{ 
    Console.WriteLine(act.Invoke()); 
} 

環外殼變量的輸出

9 
9 
9 

迴路可變外殼的解決方案,製作循環變量的副本並將其傳遞到行動。

while (variable < 3) 
{ 
    int copy = variable; 
    actions.Add(() => copy * copy); 
    ++ variable; 
} 

輸出

0 
1 
4 
+0

不客氣。 – Adil

+3

你應該提到'foreach'循環的閉包語義(不是'for'或'while'等其他循環)從C#4改爲C#5。所以如果你在一些匿名函數中捕獲由'foreach'聲明的變量(通常是lambda表達式,使用'=>'箭頭),結果取決於您的C#版本。 –