在Python中尝试直到没有错误
我有一段Python代码,它会偶尔出错,因为它在访问一个服务器,而这个服务器有时候会出现500内部服务器错误。我想一直尝试,直到不再出现这个错误。我的解决办法是:
while True:
try:
#code with possible error
except:
continue
else:
#the rest of the code
break
我觉得这有点像是临时解决办法。有没有更符合Python风格的方法呢?
12 个回答
33
也许可以这样做:
connected = False
while not connected:
try:
try_connect()
connected = True
except ...:
pass
61
这里有一个例子,它在尝试了4次后会彻底失败,并且每次尝试之间会等待2秒。你可以根据自己的需要修改这个例子:
from time import sleep
for x in range(0, 4): # try 4 times
try:
# msg.send()
# put your logic here
str_error = None
except Exception as str_error:
pass
if str_error:
sleep(2) # wait for 2 seconds before trying to fetch the data again
else:
break
下面是一个带有退避机制的例子:
from time import sleep
sleep_time = 2
num_retries = 4
for x in range(0, num_retries):
try:
# put your logic here
str_error = None
except Exception as e:
str_error = str(e)
if str_error:
sleep(sleep_time) # wait before trying to fetch the data again
sleep_time *= 2 # Implement your backoff algorithm here i.e. exponential backoff
else:
break
130
这样做不会更简洁。这其实不是个很好的做法。最好的情况是(这样写也更容易理解,因为break
的条件和while
在一起),你可以创建一个变量result = None
,然后在result
是None
的时候循环。你还需要调整一下变量,并且可以把continue
换成更合适的pass
(因为你不在乎是否发生错误,只想忽略它),同时去掉break
- 这样可以把只执行一次的其余代码放到循环外面。另外要注意,单独使用except:
是不好的,具体原因可以参考文档中的说明。
下面是一个包含以上所有内容的示例:
result = None
while result is None:
try:
# connect
result = get_data(...)
except:
pass
# other code that uses result but is not involved in getting it