状态码500不被视为异常

pos*_*nim 4 python error-handling http python-requests

向服务器发出请求,如下面的代码所示,我有状态码500,它没有被捕获为异常。输出为“ 500”,但我需要所有500个代码才能生成sys.exit()。request.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)
Run Code Online (Sandbox Code Playgroud)

jar*_*889 6

请求文档

如果我们发出了错误的请求(4XX 客户端错误或 5XX 服务器错误响应),我们可以使用 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
Run Code Online (Sandbox Code Playgroud)

所以,使用

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!
Run Code Online (Sandbox Code Playgroud)


Nic*_*k T 6

如果您希望请求成功,但“非OK”响应引发错误,请调用response.raise_for_status(). 然后,您可以捕获该错误并进行适当处理。它将引发一个requests.exceptions.HTTPError使response对象挂在错误上的错误。


Mos*_*oye 5

状态码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'):
    ...
Run Code Online (Sandbox Code Playgroud)