何时使用 \`raise_for_status\` 与 \`status_code\` 测试

新手上路,请多包涵

我一直使用:

 r = requests.get(url)
if r.status_code == 200:
    # my passing code
else:
    # anything else, if this even exists

现在我正在处理另一个问题并决定允许其他错误并且现在使用:

 try:
    r = requests.get(url)
    r.raise_for_status()
except requests.exceptions.ConnectionError as err:
    # eg, no internet
    raise SystemExit(err)
except requests.exceptions.HTTPError as err:
    # eg, url, server and other errors
    raise SystemExit(err)
# the rest of my code is going here

除了可以在此级别测试各种其他错误之外,一种方法是否比另一种更好?

原文由 Madivad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

Response.raise_for_status() 只是一种用于检查状态代码的内置方法,其作用与您的第一个示例基本相同。

这里没有“更好”之分,只是个人对流量控制的偏好。我更喜欢使用 try/except 块来捕获任何调用中的错误,因为这会告知未来的程序员这些情况是某种错误。 if/else 不一定表示扫码出错。


编辑: 这是我的快捷模式。

 import time

import requests
from requests.exceptions import HTTPError

url = "https://theurl.com"
retries = 3

for n in range(retries):
    try:
        response = requests.get(url)
        response.raise_for_status()

        break

    except HTTPError as exc:
        code = exc.response.status_code

        if code in [429, 500, 502, 503, 504]:
            # retry after n seconds
            time.sleep(n)
            continue

        raise


但是,在大多数情况下,我将 requests.Session 子类化,创建一个自定义 HTTPAdapter 来处理指数退避,并且上面的内容位于被覆盖的 requests.Session.request 方法中可以在 此处 看到一个示例。

原文由 Sam Morgan 发布,翻译遵循 CC BY-SA 4.0 许可协议

几乎总是, raise_for_status() 更好。

主要原因是它比测试 status_code == 200 多一点,您应该充分利用经过试验和测试的代码,而不是创建自己的实现。

例如,您是否知道 HTTP 标准实际上定义了五种不同的“成功”代码?通过测试 status_code == 200 ,其中四个“成功”代码将被误解为失败。

原文由 Ian Goldby 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题