python:捕获请求库中无效 JSON 的异常
python: catch exception for invalid JSON in requests library
我有相当旧的系统 CentOS-7.4 和 python
软件包 requests-2.26.0.
import requests
...
try:
response = requests.post("http://localhost:8000", json={ '' })
except requests.exceptions.RequestException as e:
print e
except requests.exceptions.InvalidJSONError:
print "Invalid JSON Error."
...
由于传递给 post
方法的 json
无效,我原以为异常会捕获它,但是我得到了这个:
Traceback (most recent call last):
File "./cfg.py", line 219, in <module>
response = requests.post(URL, json={ '' })
File "/usr/lib/python2.7/site-packages/requests/api.py", line 117, in post
return request('post', url, data=data, json=json, **kwargs)
File "/usr/lib/python2.7/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 528, in request
prep = self.prepare_request(req)
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 466, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/usr/lib/python2.7/site-packages/requests/models.py", line 319, in prepare
self.prepare_body(data, files, json)
File "/usr/lib/python2.7/site-packages/requests/models.py", line 471, in prepare_body
body = complexjson.dumps(json, allow_nan=False)
File "/usr/lib64/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib64/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib64/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/usr/lib64/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: set(['']) is not JSON serializable
我做错了什么?
Requests 使用 simplejson
或 json
库对 JSON 数据进行编码。引发 ValueError
的任何内容都会被捕获并转换为 InvalidJSONError
,但 TypeError
不会被捕获。 See here:
try:
body = complexjson.dumps(json, allow_nan=False)
except ValueError as ve:
raise InvalidJSONError(ve, request=self)
您的测试适用于以下任一示例:
a = {}
a["a"] = a
requests.get("http://url", json=a)
requests.get("http://url", json={"a": float("nan")})
最简单的方法是在 except
:
中也捕获 TypeError
try:
response = requests.post("http://localhost:8000", json={''})
except requests.exceptions.RequestException as e:
print(e)
except (requests.exceptions.InvalidJSONError, TypeError):
print("Invalid JSON Error.")
我有相当旧的系统 CentOS-7.4 和 python
软件包 requests-2.26.0.
import requests
...
try:
response = requests.post("http://localhost:8000", json={ '' })
except requests.exceptions.RequestException as e:
print e
except requests.exceptions.InvalidJSONError:
print "Invalid JSON Error."
...
由于传递给 post
方法的 json
无效,我原以为异常会捕获它,但是我得到了这个:
Traceback (most recent call last):
File "./cfg.py", line 219, in <module>
response = requests.post(URL, json={ '' })
File "/usr/lib/python2.7/site-packages/requests/api.py", line 117, in post
return request('post', url, data=data, json=json, **kwargs)
File "/usr/lib/python2.7/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 528, in request
prep = self.prepare_request(req)
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 466, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "/usr/lib/python2.7/site-packages/requests/models.py", line 319, in prepare
self.prepare_body(data, files, json)
File "/usr/lib/python2.7/site-packages/requests/models.py", line 471, in prepare_body
body = complexjson.dumps(json, allow_nan=False)
File "/usr/lib64/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib64/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib64/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/usr/lib64/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: set(['']) is not JSON serializable
我做错了什么?
Requests 使用 simplejson
或 json
库对 JSON 数据进行编码。引发 ValueError
的任何内容都会被捕获并转换为 InvalidJSONError
,但 TypeError
不会被捕获。 See here:
try: body = complexjson.dumps(json, allow_nan=False) except ValueError as ve: raise InvalidJSONError(ve, request=self)
您的测试适用于以下任一示例:
a = {}
a["a"] = a
requests.get("http://url", json=a)
requests.get("http://url", json={"a": float("nan")})
最简单的方法是在 except
:
TypeError
try:
response = requests.post("http://localhost:8000", json={''})
except requests.exceptions.RequestException as e:
print(e)
except (requests.exceptions.InvalidJSONError, TypeError):
print("Invalid JSON Error.")