我在使用异常处理是新手。 我现在用的是机械化模块凑几个网站。 我的程序常常失败,因为连接较慢,因为请求暂停。 我希望能够重试网站(上超时,例如)最多5次后之间的每个尝试30秒延迟。
我看着这个计算器的答案,可以看我怎么可以处理各种异常。 我也看到了(虽然它看起来很笨拙)我怎么可以把试/异常while循环来控制5次尝试内......但我不知道如何打出来的循环,或“继续”,当连接是成功的,没有异常已经抛出。
from mechanize import Browser
import time
b = Browser()
tried=0
while tried < 5:
try:
r=b.open('http://www.google.com/foobar')
except (mechanize.HTTPError,mechanize.URLError) as e:
if isinstance(e,mechanize.HTTPError):
print e.code
tried += 1
sleep(30)
if tried > 4:
exit()
else:
print e.reason.args
tried += 1
sleep(30)
if tried > 4:
exit()
print "How can I get to here after the first successful b.open() attempt????"
我将不胜感激约(1)如何打破循环的一个成功的开放的意见,和(2)如何使整个街区少笨拙/更优雅。
您不必再重复的东西在不同的是,你在任何情况下做块。
from mechanize import Browser
import time
b = Browser()
tried=0
while True:
try:
r=b.open('http://www.google.com/foobar')
except (mechanize.HTTPError,mechanize.URLError) as e:
tried += 1
if isinstance(e,mechanize.HTTPError):
print e.code
else:
print e.reason.args
if tried > 4:
exit()
sleep(30)
continue
break
此外,您可能能够使用while not r:
这取决于Browser.open
返回。
编辑: roadierich呈现出更优雅的方式与
try:
doSomething()
break
except:
...
因为错误跳到除了块。
你的第一个问题是可以做到的break
:
while tried < 5:
try:
r=b.open('http://www.google.com/foobar')
break
except #etc...
真正的问题,但是,你真的想:这就是被称为“意大利面条代码”:如果你试图通过程序图的执行,它看起来像意大利面条板。
你有真正的(恕我直言)的问题,是你的退出while循环的逻辑是有缺陷的。 而不是尝试,直到你已经有了一个连接,停止了一些尝试(即不会发生,因为你已经离开反正一个条件)后,循环:
#imports etc
tried=0
connected = False
while not Connected:
try:
r = b.open('http://www.google.com/foobar')
connected = true # if line above fails, this is never executed
except mechanize.HTTPError as e:
print e.code
tried += 1
if tried > 4:
exit()
sleep(30)
except mechanize.URLError as e:
print e.reason.args
tried += 1
if tried > 4:
exit()
sleep(30)
#Do stuff
关于第一个问题,你只是想在“破发”的关键字,它打破了一个循环。
对于第二个问题,你可以有几个“除了”条款的一个“尝试”,针对不同类型的异常。 这将替换您的isinstance()检查,将让你的代码更加清晰。