尝试/除了使用 Python requests 模块的正确方法?

新手上路,请多包涵
try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print(e)

这个对吗?有没有更好的方法来构建它?这会覆盖我所有的基地吗?

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

阅读 869
1 个回答

查看请求 异常文档。简而言之:

如果出现网络问题(例如 DNS 故障、连接被拒绝等),请求将引发 ConnectionError 异常。

如果出现罕见的无效 HTTP 响应,Requests 将引发 HTTPError 异常。

如果请求超时,则会引发 Timeout 异常。

如果请求超过配置的最大重定向次数,则会引发 TooManyRedirects 异常。

Requests 显式引发的所有异常都继承自 requests.exceptions.RequestException

要回答您的问题,您所展示的内容 不会 涵盖您的所有基础。您只会捕获与连接相关的错误,而不是超时的错误。

捕获异常时该怎么做实际上取决于脚本/程序的设计。可以接受退出吗?你可以继续再试一次吗?如果错误是灾难性的并且您无法继续,那么是的,您可以通过引发 SystemExit 来中止程序(打印错误并调用 sys.exit 的好方法)。

您可以捕获基类异常,它将处理所有情况:

 try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e:  # This is the correct syntax
    raise SystemExit(e)

或者你可以分别捕捉它们并做不同的事情。

 try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.Timeout:
    # Maybe set up for a retry, or continue in a retry loop
except requests.exceptions.TooManyRedirects:
    # Tell the user their URL was bad and try a different one
except requests.exceptions.RequestException as e:
    # catastrophic error. bail.
    raise SystemExit(e)


正如 克里斯蒂安 所指出的:

如果您希望 http 错误(例如 401 Unauthorized)引发异常,您可以调用 Response.raise_for_status 。如果响应是 http 错误,这将引发 HTTPError

一个例子:

 try:
    r = requests.get('http://www.google.com/nothere')
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    raise SystemExit(err)

将打印:

 404 Client Error: Not Found for url: http://www.google.com/nothere

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

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