【问题标题】:How to get out of a try/except inside a while? [Python]如何在一段时间内摆脱尝试/除外? [Python]
【发布时间】:2011-03-13 01:27:19
【问题描述】:

我正在尝试这个简单的代码,但是该死的 break 不起作用……出了什么问题?

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'

它应该在连接工作时离开,如果没有,则返回并尝试另一个代理

好的,这就是我正在做的事情

我正在尝试检查一个网站,如果它发生了变化,它必须中断一段时间才能继续执行脚本的其余部分,但是当代理未连接时,我从变量中得到错误,因为它是空的,所以我想要的是这个作为循环工作来尝试代理,如果它工作,继续脚本,脚本结束,返回并尝试下一个代理,如果下一个不起作用, 会回到最开始尝试第三个代理,以此类推....

我正在尝试这样的事情

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'

【问题讨论】:

  • 你知道break 也会跳出for循环。所以你的 break 不会跳出 while 循环,它会跳出直接 for 循环。
  • 你永远不应该使用裸excepts!捕获特定错误总是更好!

标签: python while-loop


【解决方案1】:

你只是跳出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'

【讨论】:

  • 如果继续遍历代理没有意义,您可能还希望在将运行设置为 False 后保持中断。
  • 我认为完全没有理由使用 while —— 我只是将它留在了我的代码示例中,因为我认为它是作者实际尝试实现的简化版本。最简单的解决方案就是删除 while 循环。
  • while 循环让脚本再次尝试相同的代理,希望其中一个现在开始工作。代替 while 循环,您可以在 itertools.cycle(proxylist) 中使用代理,然后一个简单的 break 就足够了,不需要额外的控制变量。
【解决方案2】:

您可以使用自定义异常然后捕获它:

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'

【讨论】:

  • 异常是不是很慢,不应该用于非异常的事情,比如条件程序流?
  • @ChristopherPisz 没有。在 python 中,异常通常是推荐的做事方式
【解决方案3】:

您只跳出for 循环,因此您永远不会离开while 循环并一遍又一遍地重新开始迭代proxylist。只是省略了周围的while循环,我实际上不明白你为什么首先将代码包含在while True中。

【讨论】:

    【解决方案4】:

    break 打破了最里面的循环,在你的情况下是 for 循环。要打破多个循环,您有几个选择:

    1. 引入条件
    2. 创建一个子并使用return

    但在您的情况下,您实际上根本不需要外部 while 循环。只需将其删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多