web-dev-qa-db-ja.com

試してみる/しばらくの間を除いて抜け出す方法は? [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'

接続が機能する間はしばらく離れ、機能しなかった場合は戻って別のプロキシを試すことになっています。

わかりました、これが私がしていることです

ウェブサイトをチェックしようとしていますが、変更された場合は、スクリプトの残りの部分に進むためにしばらくの間中断する必要がありますが、プロキシが接続されない場合、変数がnullであるため、エラーが発生します。だから私が欲しいのは、プロキシを試すためのループとして機能するためのものです。それが機能する場合は、スクリプトを続行し、スクリプトの終わりに戻って次のプロキシを試してください。次のプロキシが機能しない場合は、最初に戻って3番目のプロキシを試してください。

私はこのようなことを試みています

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'
9
Bruno 'Shady'

forループから抜け出すだけです-whileループではありません:

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'
14
petraszd

カスタム例外を使用して、それをキャッチできます。

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'
5
dfostic

forループから抜け出すだけなので、whileループを離れて、proxylistを何度も繰り返し繰り返すことはありません。周囲のwhileループを省略してください。そもそも、なぜコードをwhile Trueで囲んだのかわかりません。

3
Johannes Charra

breakは、最も内側のループ、つまりあなたの場合はforループを壊しています。複数のループから抜け出すには、いくつかのオプションがあります。

  1. 条件を導入する
  2. サブを作成し、returnを使用します

しかし、あなたの場合、実際には外側のwhileループはまったく必要ありません。削除するだけです。

2
unbeli