提出请求错误的最佳方法是什么?

时间:2016-10-27 14:09:39

标签: python python-requests

我正在阅读一些源代码,它会以下列方式引发错误请求的错误:

import requests

response = requests.get("www.google.com")   # This won't work because it's missing the http://
if response.ok is False or response.json()['status'] != 'success':
    raise Exception("API error: {}".format(response.json()['message']))

我原以为最后两行可以替换为

response.raise_for_status()

我实际上没有看到返回的错误有任何区别。在这两种情况下都是

Traceback (most recent call last):
  File "/home/kurt/Documents/Scratch/requests_test.py", line 3, in <module>
    response = requests.get("www.google.com")   # This won't work because it's missing the http://
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/api.py", line 69, in get
    return request('get', url, params=params, **kwargs)
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/api.py", line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/sessions.py", line 451, in request
    prep = self.prepare_request(req)
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/sessions.py", line 382, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/models.py", line 304, in prepare
    self.prepare_url(url, params)
  File "/home/kurt/.local/lib/python2.7/site-packages/requests/models.py", line 362, in prepare_url
    to_native_string(url, 'utf8')))
requests.exceptions.MissingSchema: Invalid URL 'www.google.com': No schema supplied. Perhaps you meant http://www.google.com?

在我看来raise_for_status()更简洁,也许也不会丢失原始异常的信息(参见Use of "except Exception" vs. "except ... raise" in Python)。这确实是一种更好的方法吗?

1 个答案:

答案 0 :(得分:3)

如果响应状态代码不是200响应,则

response.raise_for_status()仅引发异常。第二种情况,response.json()['status'] != 'success'为真,覆盖。

但是,您有不同的错误。您永远不会进入if测试,因为requests.get()调用会引发异常。您未能传入架构(一开始没有http://https://)。因为在requests.get()表达式中引发了异常,所以下一行根本就不会被执行。甚至没有发送请求,因此您也无法对响应做出任何断言。

测试有更多问题:

  • requests.ok is False不是惯用的Python;你使用not requests.ok而不是
  • 如果requests.ok is False为真,那么requests.json()调用很可能会完全失败,因此使用response.json()['message'])的下一行会产生不同的异常。