【问题标题】:python 2/3 compatibility issue with exceptionpython 2/3 兼容性问题与异常
【发布时间】:2018-11-17 20:42:49
【问题描述】:

我编写了以下与 python3 一起使用的代码

try:
    json.loads(text)
except json.decoder.JSONDecodeError:
    (exception handling)

但是,如果我使用 python2,当json.loads 抛出我得到的异常时:

File "mycode.py", line xxx, in function
    except json.decoder.JSONDecodeError:
AttributeError: 'module' object has no attribute 'JSONDecodeError'

实际上,https://docs.python.org/2/library/json.html 没有提到任何 JSONDecodeError 异常,而 https://docs.python.org/3/library/json.html 有。

如何让代码同时运行在 python 2 和 3 上?

【问题讨论】:

  • 在 2.x 文档中,它指的是 ValueError,其中 3.x 指的是 JSONDecodeError

标签: python-3.x python-2.x


【解决方案1】:

在 Python 2 中 json.loads 引发 ValueError

Python 2.7.9 (default, Sep 17 2016, 20:26:04)
>>> json.loads('#$')                                                
Traceback (most recent call last):                                  
  File "<stdin>", line 1, in <module>                               
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads    
    return _default_decoder.decode(s)                               
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode    
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())               
  File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")             
ValueError: No JSON object could be decoded

您可以尝试使用json.decoder.JSONDecodeError。如果它失败了,你就会知道你需要赶上ValueError

try:
    json_parse_exception = json.decoder.JSONDecodeError
except AttributeError:  # Python 2
    json_parse_exception = ValueError

然后

try:
    json.loads(text)
except json_parse_exception:
    (exception handling)

在任何一种情况下都可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多