我正在阅读一些源代码,它会以下列方式引发错误请求的错误:
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)。这确实是一种更好的方法吗?
答案 0 :(得分:3)
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'])
的下一行会产生不同的异常。