检查python中的多个异常

检查python中的多个异常,python,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 i

假设我有:

 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')
因此,基本上,我想提出适当的数值误差。。但是马上无论是什么原因导致了这个问题,我认为“错误的json格式”是一个例外。。 我不想有多个try子句??
有没有办法在同一try子句中抛出相关字符串

是的,您只需将except语句替换为:

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

因为raise将重新释放上一个异常。

您希望捕获模式检查器引发的异常,但在此之前,您实际上得到了json本身引发的异常

为了区分差异,您需要定义模式将引发的异常

还要注意,json可能会返回unicode,这与您的检查中的str不一致:isinstance(u“something”,str)


什么是“相关字符串”?我不理解你写的问题,但我认为你想要的只是
raise
本身。在没有参数的情况下,它会使用已经存在的任何文本重新引发异常。但是,如果您没有在except子句中执行任何额外的代码,这是完全没有意义的--只是不要捕获异常。换句话说,如果您的问题是捕获异常并用放在那里的内容替换有用的错误消息,请停止这样做。已编辑。。虽然我认为这会在函数中总是抛出异常,因为我总是抛出ValueError(修复它…),但json模块希望属性名用双引号括起来。如果您直接抛出捕获到的错误,为什么还要费心捕获它?!这不仅毫无意义,而且是错误的,因为您将丢失回溯信息。只是别抓住它。如果要记录日志,请说
raise
,以正确地重新提升日志。(不是
举起e
)显然,他想再次抓住它。可能是因为这是一种代码简化,他希望在重新验证之前分析错误(可能仅在特定情况下)
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'