如何在python中异常重试一次

时间:2013-08-09 17:41:09

标签: python http exception-handling python-requests

我可能会以错误的方式接近这个,但我有一个POST请求:

response = requests.post(full_url, json.dumps(data))

由于多种原因可能会失败,其中一些与数据有关,一些是临时故障,由于设计不良的端点可能会返回相同的错误(服务器使用无效数据做不可预测的事情)。为了捕获这些临时故障并让其他人通过,我认为最好的方法是重试一次,然后如果再次引发错误则继续。我相信我可以用嵌套的尝试/除外,但对我来说这似乎是不好的做法(如果我想在放弃之前尝试两次怎么办?)

该解决方案将是:

try:
    response = requests.post(full_url, json.dumps(data))
except RequestException:
    try:
        response = requests.post(full_url, json.dumps(data))
    except:
        continue

有更好的方法吗?或者,通常有更好的方法来处理潜在的错误HTTP响应吗?

1 个答案:

答案 0 :(得分:16)

for _ in range(2):
    try:
        response = requests.post(full_url, json.dumps(data))
        break
    except RequestException:
        pass
else:
    raise # both tries failed

如果你需要一个功能:

def multiple_tries(func, times, exceptions):
    for _ in range(times):
        try:
            return func()
        except Exception as e:
            if not isinstance(e, exceptions):
                raise # reraises unexpected exceptions 
    raise # reraises if attempts are unsuccessful

像这样使用:

func = lambda:requests.post(full_url, json.dumps(data))
response = multiple_tries(func, 2, RequestException)