如何在异常处理后返回for循环

34 投票
3 回答
79739 浏览
提问于 2025-04-15 16:40

我准备好运行这段代码了,但在此之前我想先处理一下异常情况:

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)
    ....

正如这里所建议的,我加了一个try...except,但是现在如果某个页面打不开,我就会收到这个错误:

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

这样程序就会继续执行。但我希望它能回到循环中,尝试下一个网址。我试过用break代替pass,但那样会结束整个程序。有没有什么建议?

3 个回答

1

你遇到这个错误是因为在抛出异常的时候,response这个变量并不存在。如果你想保持现在的代码不变,就需要在调用read之前检查一下response是否存在。

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

说到这里,我同意Mark的看法,continuepass更好。

20

其实,try的功能比这要强大得多。你在这里也可以使用else块:

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

continue 代替 break

pass 这个语句其实什么都不做(也就是说它没有任何作用)。程序会直接跳到下一个语句,这就是你为什么会遇到错误的原因。

break 是用来退出循环的,它会让程序从循环结束后的下一个语句开始继续执行。在这种情况下,循环后面没有其他语句,所以你的程序就结束了。

continue 会重新开始循环,但会处理下一个项目。这正是你想要的效果。

撰写回答