jsonc: handle parse errors from 'json' gracefully (fixes #2858)
- JSONDecodeError is only available in simplejson, use ValueError - imporove error context output
This commit is contained in:
parent
3ed213d6d7
commit
98d83192ce
1 changed files with 17 additions and 5 deletions
22
ox/jsonc.py
22
ox/jsonc.py
|
@ -3,6 +3,8 @@
|
||||||
# vi:si:et:sw=4:sts=4:ts=4
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
from __future__ import with_statement, print_function
|
from __future__ import with_statement, print_function
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
from .js import minify
|
from .js import minify
|
||||||
from .utils import json
|
from .utils import json
|
||||||
|
|
||||||
|
@ -14,8 +16,18 @@ def loads(source):
|
||||||
try:
|
try:
|
||||||
minified = minify(source)
|
minified = minify(source)
|
||||||
return json.loads(minified)
|
return json.loads(minified)
|
||||||
except json.JSONDecodeError as e:
|
except ValueError as e:
|
||||||
s = minified.split('\n')
|
msg = e.message if hasattr(e, 'message') else str(e)
|
||||||
context = s[e.lineno-1][max(0, e.colno-1):e.colno+30]
|
lineno = None
|
||||||
msg = e.msg + ' at ' + context
|
colno = None
|
||||||
raise json.JSONDecodeError(msg, minified, e.pos)
|
try:
|
||||||
|
m = re.search(r'line (\d+) column (\d+)', msg)
|
||||||
|
if m:
|
||||||
|
(lineno, colno) = map(int, m.groups())
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if lineno and colno:
|
||||||
|
s = minified.split('\n')
|
||||||
|
context = s[lineno-1][max(0, colno-30):colno+30]
|
||||||
|
msg += ' at:\n\n %s\n %s\033[1m^\033[0m' %(context, ' ' * (colno - max(0, colno-30) - 2))
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
Loading…
Reference in a new issue