处理不同版本的python的不同错误

时间:2017-07-08 18:40:05

标签: python json

我遇到了json模块针对不同版本的Python捕获错误的问题。 json模块会为JSONDecodeError投放Python 3.5.2,为ValueError投放Python 2.7.12。这样做的最佳做法是什么?

例如,这适用于Python 2.7.12

a = '{"a": [5 8]}'
try:
    d = json.loads(a)
except ValueError:
    # do something

这适用于Python 3.5.2

a = '{"a": [5 8]}'
try:
    d = json.loads(a)
except json.JSONDecodeError:
    # do something

我已经看到答案here,但我希望找到一种更优雅的方式。

2 个答案:

答案 0 :(得分:2)

JSONDecodeErrorValueError的子类:

>>> from json import JSONDecodeError
>>> issubclass(JSONDecodeError, ValueError)
True

坚持抓住ValueError;如果您需要支持这两个版本,它应该足够了。所有JSONDecodeError添加的是一些额外的字段,使您可以轻松访问已解析的文档以及错误的确切位置。

如果您需要访问这些属性(只要它们存在),只需先使用hasattr()进行测试:

try:
    d = json.loads(a)
except ValueError as err:
    pos = (None, None)
    if hasattr(err, lineno):
        # JSONDecodeError subclass
        pos = err.lineno, err.colno

答案 1 :(得分:0)

对于特别是div.p-mask模块,基本上simplejson打包为json模块并使用Python分发,您可以使用{的最新(或至少相同)版本{1}}。

这样,所有Python版本中的异常都是相同的:json