2015-07-01 3 views
-1

Допустим, у меня есть:проверить несколько исключений в Python

string = """{'prop1': 'foo' , 'prop2': [1,2,3], 'prop3': [12,3]} """ 

    def _validate_schema(blob): 
    schema = {'prop1': str, 'prop2': list, 'prop3': list} 
    if blob.keys() in schema.keys(): 
     for k, v in blob.iteritems(): 
     if isinstance(v, schema[k]): 
      continue 
    raise ValueError("Bad schema: \ 
         Expected: %s, \ 
         Got: %s \ 
        " % (schema, blob)) 


    # Usage 
    try: 
     jsn = json.loads(string) 
     _validate_schema(jsn) 
    except ValueError: 
    raise ValueError(' bad json format') 

Так в основном, я хочу поднять соответствующий ValueError .. но .. сейчас .. все, что вызывает проблемы я вижу «плохой формат JSON» как исключение .. И я не хочу иметь несколько предложений try? Есть ли способ бросить соответствующую строку в том же предложении try ..?

+0

Что бы «соответствующая строка»? –

+1

Я не понимаю ваш вопрос, как написано, но я думаю, что вы хотите просто «поднять» самостоятельно. Без аргументов он исключает исключение из любого текста, который уже существует. Однако, если вы не делаете никакого дополнительного кода в своем предложении except, это совершенно бессмысленно - просто не поймайте исключение. –

+3

Другими словами, если ваша проблема заключается в том, что вы перехватываете исключение и заменяете полезное сообщение об ошибке тем, что вы там помещаете, просто прекратите это делать. –

ответ

0

Да, вы можете просто заменить ваш кроме заявления:

except ValueError as e: 
    # do whatever to analyse e 
    raise 

Поскольку рейз ререйза предыдущего исключения.

+1

Если вы поднимете ошибку, которую сразу поймали, ** зачем ее ловить? ** – jonrsharpe

+0

Не только это бессмысленно, это неправильно, так как вы потеряете информацию о трассировке. Просто не поймайте его. Если вы хотите войти в систему, тогда скажите 'raise', чтобы повторно поднять его правильно. (Не 'raise e') – tzaman

+0

Очевидно, он хочет снова поймать его. Возможно, потому, что это упрощение кода, и он хочет проанализировать ошибку до ее ререйза (возможно, только в конкретных случаях) – DevShark

0

Вы ожидаете, что поймаете исключение, которое вы выбрали с помощью вашей схемы, но вы действительно получаете исключение, которое было создано самим 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' 
Смежные вопросы