【问题标题】:How to get back to the for loop after exception handling异常处理后如何返回for循环
【发布时间】:2009-12-03 22:59:53
【问题描述】:

我已准备好运行此代码,但在我想修复异常处理之前:

for l in bios:
    OpenThisLink = url + l
    try:
        response = urllib2.urlopen(OpenThisLink)
    except urllib2.HTTPError:
        pass
    bio = response.read()
    item = re.search('(JD)(.*?)(\d+)', bio)
    ....

按照here 的建议,我添加了try...except,但现在如果页面无法打开,我会收到此错误:

bio = response.read()
NameError: name 'response' is not defined

所以程序继续执行。相反,我希望它返回 for 循环并尝试下一个 url。我尝试了break 而不是pass 但这结束了程序。有什么建议吗?

【问题讨论】:

    标签: python exception-handling


    【解决方案1】:

    使用continue 代替break

    语句pass 是一个无操作(意味着它不做任何事情)。程序只是继续下一条语句,这就是你得到错误的原因。

    break 退出循环并在循环之后立即从下一条语句继续运行。在这种情况下,没有更多的语句,这就是您的程序终止的原因。

    continue 重新开始循环,但使用下一项。这正是你想要的。

    【讨论】:

    • 处理异常后,它会返回到它被捕获的地方,就像大多数窃贼一样。
    • @jathanism:不,它没有。如果你不再次raise 它,它会继续到except 块之后的语句。
    【解决方案2】:

    尝试实际上比这更强大。你也可以在这里使用 else 块:

    try:
        stuff
    except Exception:
        print "oh no a exception"
    else:
        print "oh yay no exception"
    finally:
        print "leaving the try block"
    

    【讨论】:

    • else 语句在一般情况下很有用,但在大多数正常情况下(即无例外)运行此代码时,else 代码最终会缩进。在您的情况下,继续意味着“在异常时跳过其余循环”,这是预期的功能,因此继续恕我直言更具可读性。
    【解决方案3】:

    您收到该错误是因为引发异常时响应变量不存在。如果你想保留代码,你需要在调用 read 之前检查响应是否存在

    if response:
        bio = response.read()
        ...
    

    我同意 Mark 的观点,即 continuepass 更好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多