2009-10-24 17 views
6

我想穿過一次循環,但只有在拋出異常時纔會返回循環。我將如何用C#編寫這個?C#我應該循環直到沒有例外?

謝謝

+0

這不是我清楚你的意思。你爲什麼不張貼一些代碼,說出你想要的結果,以及實際發生的事情。 – RossFabricant 2009-10-24 23:48:35

+0

我想知道計劃是否要循環,如果有異常,那麼跳過問題對象並繼續循環,但這只是一個猜測。 – 2009-10-25 00:02:19

回答

1

似乎是一個不錯的主意,但無論如何嘗試這樣的事:

bool exceptionthrown = false; 
while (!exceptionthrown) 
{ 
    try 
    { 
    // Do magic here 
    } 
    catch (Exception) 
    { 
    exceptionthrown = true; 
    throw; 
    } 
} 
+3

如果拋出異常,此代碼不會返回循環。實際上添加的代碼實際上什麼都沒有。 – lockstock 2012-03-13 04:43:06

19

這對我來說是不好的設計的氣味。一般規則是:例外應該而不是用於流量控制。有許多的原因;即通常有更好/更可靠的方法可用於在拋出異常之前進行檢查,並且還會降低效率。

然而,只是爲了討論的方便,你可以這樣做以下:

while (true) 
{ 
    try 
    { 
     // do stuff here 
    } 
    catch (MyException) 
    { 
     continue; 
    } 

    // all is good 
    break; 
} 

再次 - 這是的推薦方式。如果你能提供更多的上下文/例子,我會很樂意提供一些更好的建議。例如:

+1

我可以想到在某些情況下,這不是天生不好的設計(例如,在超時異常時重試片狀網絡操作),但不是很多。 – 2009-10-25 07:05:42

+0

也許系統基於數據庫響應,您必須等待它,直到它工作! – 2015-08-15 02:49:39

+0

這比實際接受的答案要好得多 – derekantrican 2017-06-30 01:54:52

1

這真的取決於你在做什麼以及拋出異常的類型。許多異常並不是通過再次使用完全相同的輸入/數據來解決的,因此循環只會持續生成異常。

相反,您應該檢查相關的異常,然後以適當的方式處理這些異常。

0

爲什麼不調用實際執行循環的函數,並在函數之後再次調用該函數。

private void loop() { 
    for(...) { 
    } 
} 

一些其他的方法:

try { 
    loop(); 
} catch(Exception e) { 
    loop(); 
} 
+1

如果在第二次通過時再次拋出異常,則會出現問題。 – RandomGuy 2010-09-14 22:05:24

0

喜歡的東西:

bool done = false; 
while(! done) 
{ 
    try 
    { 
    DoSomething(); 
    done = true; 
    } catch(Exception ex) 
    { 
    HandleException(ex); 
    } 
} 

正如Noldorin說,它聞起來像一個糟糕的設計。您正在使用異常來控制程序的流程。最好對導致您重複操作的條件進行明確檢查。

2

什麼下面,您可以設置重試次數:

  int tryCount = 0; 

      while (tryCount < 3) 
      { 
       try 
       { 
        someReturn = SomeFunction(someParams); 
       } 
       catch (Exception) 
       { 
        tryCount++; 
        continue; 
       } 
       break; 
      }