【问题标题】:Status code 500 not treated as exception状态码 500 不被视为异常
【发布时间】:2017-02-21 23:17:26
【问题描述】:

向服务器发出请求,如下面的代码所示,我得到了状态码 500,它没有被捕获为异常。输出为“500”,但我需要所有 500 个代码才能生成 sys.exit()。 requests.exceptions.RequestException 不将 500 视为异常还是其他原因?请求模块文档http://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions 对属于此类的内容不是很清楚。如何确保所有 500 个代码都导致 sys.exit()?

import requests
import json
import sys

url = http://www.XXXXXXXX.com
headers = {'user':'me'}
try:
    r = requests.post(url, headers=headers)
    status = r.status_code
    response = json.dumps(r.json(), sort_keys=True, separators=(',', ': '))
    print status
except requests.exceptions.RequestException as e:
    print "- ERROR - Web service exception, msg = {}".format(e)
    if r.status_code < 500:
        print r.status_code
    else:
        sys.exit(-1)

【问题讨论】:

  • 这是在for 循环中吗? continuefor 块之外是语法错误,你想要pass 吗?
  • 正确,我编辑了问题 - 谢谢!

标签: python http error-handling python-requests


【解决方案1】:

来自Requests documentation

如果我们发出了错误的请求(4XX 客户端错误或 5XX 服务器错误 response),我们可以使用 Response.raise_for_status() 来提升它:

>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404

>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error

所以,使用

r = requests.post(url, headers=headers)
try:
    r.raise_for_status()
except requests.exceptions.HTTPError:
    # Gave a 500 or 404
else:
    # Move on with your life! Yay!

【讨论】:

  • 没错,但“所有 500 个代码”可能意味着 501 或 503 或其他。这也可以捕获那些没有硬编码 500 到 600 之间的每个数字的人
  • 我认为服务器配置为只为所有 500 个家庭返回“500”。所有的好点,伙计们 - 谢谢。接受摩西最直接的说法。
【解决方案2】:

状态码 500 也不例外。处理请求时出现服务器错误,服务器返回500;服务器的问题比请求的问题更多。

因此您可以取消try-except

r = requests.post(url, headers=headers)
status = r.status_code
response = json.dumps(r.json(), sort_keys=True, separators=(',', ': '))

if str(status).startswith('5'):
    ...

【讨论】:

  • 除非在这种情况下,如果它是 501 或任何其他代码,您必须在每个高于 500 的数字中编码。只有在您知道服务器将返回什么响应代码时才有用,保证
  • 很好的解决方案!没想到
  • 而不是str(status).startswith('5'),我推荐更简单的整数比较:500 &lt;= status &lt; 600(或者只是status &gt;= 500,因为没有更大的错误代码)
【解决方案3】:

如果您想要一个成功的请求,但“不正常”响应会引发错误,call response.raise_for_status()。然后,您可以捕获该错误并适当地处理它。它将引发一个requests.exceptions.HTTPError,其中response 对象挂在错误上。

【讨论】:

    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2014-02-16
    • 2017-11-28
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多