在Python中尝试直到没有错误

134 投票
12 回答
193661 浏览
提问于 2025-04-16 09:27

我有一段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,然后在resultNone的时候循环。你还需要调整一下变量,并且可以把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

撰写回答