Continuer dans les boucles while imbriquées
Dans cet exemple de code, est-il possible de continuer sur la boucle extérieure du bloc catch?
while
{
//outer loop
while
{
//inner loop
try
{
throw;
}
catch
{
//how do I continue on the outer loop from here?
continue;
}
}
}
- Boucles imbriquées seulement conduire au désespoir.
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR: Cette question a été l'inspiration pour mon article sur ce sujet. Merci pour la grande question!
"continuer" et "pause" ne sont rien de plus qu'un agréable syntaxe pour un "goto". Apparemment, en leur donnant mignon noms et la restriction de leurs usages notamment les structures de contrôle, de ne plus attirer les foudres de la "toutes les gotos sont tous mauvais de tous les temps" de la foule.
Si ce que vous voulez faire est de continuer à l'extérieur, vous pourrait simplement définir une étiquette en haut de la boucle externe, puis "goto" de cette étiquette. Si vous estimé que cela n'a pas empêché la lisibilité du code, c'est peut-être le moyen le plus efficace de la solution.
Toutefois, je prendrais cela comme une occasion d'examiner si votre flux de contrôle gagnerait à refactoring. Chaque fois que j'ai conditionnelle "break" et "continue" dans les boucles imbriquées, je considère que le refactoring.
Considérer:
Deux techniques de refactoring:
Tout d'abord, l'extrait de la boucle interne à une méthode:
Seconde, peut tous les boucles à être éliminé? Si vous êtes en boucle parce que vous essayez de chercher quelque chose, puis à refactoriser dans une requête.
Si il n'y a pas de boucles, puis il n'y a pas besoin de se casser ou continuent!
goto
, d'abord arrêter un instant et de réfléchir si vous avez vraiment le faire. Si vous avez encore besoin d'ungoto
, puis il suffit de l'utiliser - c'est dans la langue pour une raison. Ce n'est pas en soi mauvais soit - il apparaît généralement dans de mauvaises habitudes, et, par conséquent, devrait servir comme un signal pour arrêter et essayer de repérer de tels modèles (et de ne pas plonger dans "OMGgoto
c'est tout faux" panique).using System.Linq
pour la deuxième refactoring technique.Le problème est résolu. (quoi?? Pourquoi êtes-vous tous de me donner cette aspect "sale"?)
REPEAT: ;
)Vous pouvez utiliser une pause; la déclaration.
Continuer est utilisé pour sauter vers le haut de la boucle de courant.
Si vous avez besoin de sortir plus de niveaux que vous devrez ajouter une sorte de "si", ou de l'utilisation de la redoutable/pas recommandé 'goto'.
break
, mais ne voulait pas être fait lors de l'appel decontinue
. Vous auriez besoin d'un drapeau si vous avez besoin de ce code pour ne pas être exécuté. Je ne dis pas que cette réponse est fausse (zut, j'upvoted), je dis que c'est simple qu'en apparence.Swap le try/catch de la structure à l'intérieure de la boucle while:
Pas.
Je suggère, l'extraction de la boucle interne dans une méthode distincte.
Utilisation
break
dans la boucle interne.Vous veulent juste de se libérer de l'intérieur qui permettrait de continuer à l'extérieur.
Je pense que la meilleure façon d'y parvenir serait d'utiliser la pause déclaration. Pause extrémités de la boucle de courant et poursuit l'exécution de l'endroit où il se termine. Dans ce cas, il serait la fin de la boucle interne et , un saut dans l'extérieur tandis que la boucle. C'est ce que votre code devrait ressembler à:
Je crois que c'est ce que vous cherchiez à être accompli correcte?
Merci!
Utiliser un type d'exception, par exemple, MyException. Alors:
Cela fonctionne pour la poursuite et la rupture de plusieurs niveaux d'imbrication même si des déclarations.
Désolé pour la mauvaise mise en forme 😉