2010-11-10 12 views
6

Viene infine eseguito in questo caso? Ho scritto questo codice e non ho potuto decidere se alla fine è stato effettivamente eseguito in questo caso o meno. Mi piacerebbe davvero qualche spiegazione, non importa quale sia la risposta.Rottura di un loop for da un blocco catch

foreach(string s in allStrings) 
{ 
    try 
    { 
     //Error happens here 
    } 
    catch(Exception ex) 
    { 
     //Handle exception 
     break; 
    } 
    finally 
    { 
     //Clean up code 
    } 
} 
+13

"Hai provato?" – Alex

+3

Ho eseguito un esperimento, ho calcolato quanto tempo ci sarebbe voluto per creare questa domanda e ho calcolato quanto tempo ci sarebbe voluto per inserirlo in un'app console e fare clic su "Esegui". La console ha vinto. Okay, non ho davvero eseguito un esperimento, ma hai capito il punto. :) – RPM1984

+0

[* cough *] (http://stackoverflow.com/questions/4150186/breaking-out-of-a-for-loop-from-a-catch-block/4150190#4150190) –

risposta

6

Hai scritto il 90% del codice di cui avresti bisogno per rispondere a questa domanda.

Continua a scrivere.

+0

+1, mi occuperò di quello sotto (non essere originale). –

8

Sì. Infine i blocchi sono sempre eseguiti quando il controllo lascia un blocco try o catch corrispondente. (A meno che non succeda qualcosa di super-speciale, come un arresto anomalo del runtime o il thread è stato interrotto.)

2

In effetti, i blocchi vengono chiamati SEMPRE. Questo è il motivo per cui sono chiamati così ...

2

Basato sulla risposta di Matt. È davvero un vero e proprio overkill.

Suggerisco di fare qualcosa del genere e di fare in modo che il test passi. MSTest non è la migliore libreria per i test, ma è la "Standard" :)

[TestClass()] 
public class FinalClauseTester 
{ 
    private TestContext testContextInstance; 
    public TestContext TestContext 
    { 
     get 
     { 
      return testContextInstance; 
     } 
     set 
     { 
      testContextInstance = value; 
     } 
    } 

    [TestMethod] 
    [DeploymentItem(@"Something right goes here.")] 
    [DataSource("Something else goes here", "row", somethingOtherSetupCrap)] 
    public void TestFinalClause() 
    { 

     string[] allStrings = {"1", "2", "3", "4", "5"}; 
     int yesCount = 0; 
     foreach(string s in allStrings) 
     { 
      try 
      { 
       //Error happens here 
       throw new Exception(); 
      } 
      catch(Exception ex) 
      { 
       //Handle exception 
       if (yesCount == 3) 
       { 
        break; 
       } 
      } 
      finally 
      { 
       //Clean up code 
       yesCount++; 
      } 
     } 

     // And, at the end of this loop ... 
     Debug.Assert(yesCount = 3); // Or something like this. 
    } 
} 
+1

+1 anche se questo è _totale_ overkill: P –

+1

Fare questo mentre sul libro paga per una scadenza scolastica stretta è una cattiva idea in questo caso particolare; abituarsi a scrivere prove (anche se questo caso è eccessivo) può ripagare in un lontano futuro. –

+1

L'istruzione foreach non ha una chiusura '}'. Inoltre, poiché 'yesCount' inizia come 0, il risultato finale sarebbe' yesCount == 1' poiché la prima volta attraverso il loop hai lanciato un'eccezione che ha chiamato 'break' che ha interrotto il ciclo (dopo aver eseguito il blocco finally). – Trisped

1

Sì, cerca il tentativo, poi catch intercetta l'eccezione, e poi finalmente è quello che viene finalmente chiamato sia per la normale esecuzione e ha preso delle eccezioni. Penso che ci sia uno scetticismo che si nasconde da qualche parte!

Problemi correlati