【问题标题】:What is the best way to raise request errors?引发请求错误的最佳方法是什么?
【发布时间】:2016-10-27 14:09:38
【问题描述】:

我正在阅读一些源代码,这些源代码会通过以下方式引发错误请求:

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)。这确实是更好的方法吗?

【问题讨论】:

  • 您从未达到if 声明,所以不,没有区别。当请求从未发送时,您无法测试响应。

标签: python python-requests


【解决方案1】:

response.raise_for_status() 仅在响应状态代码不是 200 响应时引发异常。第二种情况,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']) 的下一行将产生不同的异常。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 2017-10-04
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多