Вы ожидаете, что поймаете исключение, которое вы выбрали с помощью вашей схемы, но вы действительно получаете исключение, которое было создано самим json до этого.
Чтобы определить разницу, вам нужно определить исключение, которое ваша схема будет поднимать.
Также обратите внимание, что JSON, вероятно, вернется Юникода, который не согласен с ул в чеке: isinstance (и «что-то», ул)
import json
string = '{"prop1": "text", "prop2": [1,2,3], "prop3": [12, 3]}'
bad_json = "{'prop1': 'text'}"
bad_1 = '{"prop1": 42, "prop2": [1,2,3], "prop3": [12, 3]}'
bad_2 = '{"prop1": "text", "prop3": [12, 3]}'
bad_3 = '{"prop1": "text", "prop2": [1,2,3], "prop3": [12, 3], "extra": 0}'
class SchemaViolation(ValueError):
pass
def _validate_schema(blob):
schema = {'prop1': unicode, 'prop2': list, 'prop3': list}
for key in blob.keys():
if key in schema.keys():
if not isinstance(blob[key], schema[key]):
raise SchemaViolation("Bad schema: \
Expected: %s, \
Got: %s \
" % (schema[key], blob[key]))
else:
raise SchemaViolation("key %s not allowed in schema" % key)
for key in schema.keys():
if key not in blob.keys():
raise SchemaViolation("key %s is missing" % key)
# Usage
try:
jsn = json.loads(string)
_validate_schema(jsn)
print 'success on good json string which matches schema'
except SchemaViolation as e:
print 'false negative'
except ValueError as e:
print 'json raised a ValueError because it was bad json: ', str(e)
try:
jsn = json.loads(bad_json)
_validate_schema(jsn)
print 'should have failed in json'
except SchemaViolation as e:
print 'should not get to here'
except ValueError as e:
print 'json correctly raised a ValueError because it was bad json: ', str(e)
try:
jsn = json.loads(bad_1)
_validate_schema(jsn)
print 'should have failed'
except SchemaViolation as e:
print 'correctly detected schema error ', str(e)
try:
jsn = json.loads(bad_2)
_validate_schema(jsn)
print 'should have failed'
except SchemaViolation as e:
print 'correctly detected schema error ', str(e)
try:
jsn = json.loads(bad_3)
_validate_schema(jsn)
print 'should have failed'
except SchemaViolation as e:
print 'correctly detected schema error ', str(e)
print 'done'
Что бы «соответствующая строка»? –
Я не понимаю ваш вопрос, как написано, но я думаю, что вы хотите просто «поднять» самостоятельно. Без аргументов он исключает исключение из любого текста, который уже существует. Однако, если вы не делаете никакого дополнительного кода в своем предложении except, это совершенно бессмысленно - просто не поймайте исключение. –
Другими словами, если ваша проблема заключается в том, что вы перехватываете исключение и заменяете полезное сообщение об ошибке тем, что вы там помещаете, просто прекратите это делать. –