【问题标题】:python: catch exception for invalid JSON in requests librarypython:在请求库中捕获无效 JSON 的异常
【发布时间】:2021-12-14 04:30:59
【问题描述】:

我有相当旧的系统 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

我做错了什么?

【问题讨论】:

    标签: python json python-2.7 exception python-requests


    【解决方案1】:

    Requests 使用 simplejsonjson 库对 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.")
    

    【讨论】:

    • 我不会在这个答案中添加注释.. 可能值得建议上游将此作为功能增强 requests 并让他们将 TypeError 转换为 InvalidJSONError
    • 感谢您的建议。 TypeError是python的内置异常吗?
    猜你喜欢
    • 2014-01-20
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多