我遇到了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,但我希望找到一种更优雅的方式。
答案 0 :(得分:2)
JSONDecodeError
是ValueError
的子类:
>>> 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
。