在捕获不同版本的json模块的错误时,我遇到了问题。json模块为Python 3.5.2抛出一个JSONDecodeError,为Python 2.7.12抛出一个ValueError。这样做的最佳做法是什么?
例如,这适用于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,但我想找到一个更优雅的方式。
发布于 2017-07-08 18:42:48
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发布于 2017-07-08 18:46:54
特别是json模块,它基本上是simplejson打包成json模块并与json一起分发的,您可以使用最新的(或至少相同的)版本的simplejson。
这样,所有版本的Python中的异常都将是相同的:JSONDecodeError。
https://stackoverflow.com/questions/44989586
复制相似问题