检查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'