2010-07-07 20 views
4

J'essaie ce code simple, mais la foutue rupture ne fonctionne pas ... qu'est-ce qui ne va pas?Comment sortir d'un essai/sauf à l'intérieur d'un moment? [Python]

while True: 
    for proxy in proxylist: 
     try: 
      h = urllib.urlopen(website, proxies = {'http': proxy}).readlines() 
      print 'worked %s' % proxy 
      break 
     except: 
      print 'error %s' % proxy 
print 'done' 

Il est censé quitter le tout lorsque les travaux de connexion, et revenir en arrière et essayer un autre proxy si elle n'a pas

ok, voici ce que je fais

Je suis en essayant de vérifier un site web et si ça a changé, il doit sortir du moment pour continuer vers le reste du script, mais quand le proxy ne se connecte pas, j'obtiens une erreur de la variable, comme c'est nul, donc ce que je voulez-vous pour le travail en boucle pour essayer un proxy, et si cela fonctionne, continuer le script, et la fin du script, revenir en arrière et essayer le proxy suivant, et si le suivant ne fonctionne pas, il sera de retour à la commence à essayer le troisième proxy, et ainsi de suite ....

J'essaie quelque chose comme ça

while True: 
    for proxy in proxylist: 
     try: 
      h = urllib.urlopen(website, proxies = {'http': proxy}) 
     except: 
      print 'error' 
     check_content = h.readlines() 
     h.close() 
     if check_before != '' and check_before != check_content: 
      break 
     check_before = check_content 
     print 'everything the same' 
print 'changed' 
+1

Vous savez que 'break' brise également des boucles pour. Donc votre 'break' ne sortira pas de la boucle while, il sortira de la boucle for immédiate. – jcao219

+1

Vous ne devriez jamais utiliser 'excepts 'nu! Il est toujours préférable d'attraper une erreur spécifique! – jathanism

Répondre

10

Vous venez de sortir de la boucle for - pas while boucle:

running = True 
while running: 
    for proxy in proxylist: 
     try: 
      h = urllib.urlopen(website, proxies = {'http': proxy}).readlines() 
      print 'worked %s' % proxy 
      running = False 
     except: 
      print 'error %s' % proxy 
print 'done' 
+8

Vous pouvez également conserver la pause après avoir défini le paramètre sur False, si cela n'a pas de sens de continuer à passer au travers des proxys. – mrooney

+1

Je ne vois aucune raison d'avoir du tout - je l'ai juste laissé dans mon exemple de code, parce que je pense que c'est une version simplifiée de ce que l'auteur essaie réellement d'accomplir. La solution la plus simple serait simplement de supprimer la boucle. – petraszd

+0

La boucle while permet au script d'essayer à nouveau les mêmes proxys, dans l'espoir que l'un d'entre eux puisse commencer à fonctionner maintenant. Au lieu de la boucle while, vous pouvez utiliser proxy pour itertools.cycle (proxylist), puis un simple break suffira sans avoir besoin de variables de contrôle supplémentaires. –

3

Vous ne sortez que de la boucle for, donc vous ne quittez jamais la boucle while et redémarrez l'itération sur le proxylist encore et encore. Juste omettre la boucle tout autour, je ne comprends pas pourquoi vous avez inclus le code dans un while True en premier lieu.

1

la rupture est la rupture de la boucle la plus interne, qui est la boucle for dans votre cas. Pour sortir de plus d'une boucle que vous avez quelques options:

  1. introduisons un état
  2. Créer un sous et utiliser return

mais dans votre cas, vous n'avez pas besoin en fait la boucle while extérieure du tout. Retirez-le.

1

Vous pouvez utiliser une exception personnalisée puis l'attraper:

exit_condition = False 

try: 

    <some code ...> 

    if exit_conditon is True: 
     raise UnboundLocalError('My exit condition was met. Leaving try block') 

    <some code ...> 

except UnboundLocalError, e: 
    print 'Here I got out of try with message %s' % e.message 
    pass 

except Exception, e: 
    print 'Here is my initial exception' 

finally: 
    print 'Here I do finally only if I want to'