Python ValueError 异常未被正确捕获
Python ValueError Exception not being caught properly
item
是一个python字典
print item.get('body')
在某些情况下给出以下输出:
"1211V1"
然而,item.get('body') 大多具有以下格式的 unicode 字符串:
u'{"points_token_id":"327727a0-3909-4132-8fa2-ee45146add1e"}'
我需要将上面的 unicode 字符串转换为 python 字典。所以我这样做:
try:
body_dic = json.loads(item.get('body'))
body_string = ""
for body_item in body_dic.keys():
body_string += body_item + ": {'required': True, 'type': 'resource', 'value': " + str(body_dic.get('body_item')) + "\n\t\t\t\t"
except Exception as e:
print "futt gayaa"
print type(e).__name__
print e.args
body_string = item.get('body')
然后是一堆代码。所以在上面那一刻 item.get('body') 结果是 "1211V1" a ValueError Exception 应该被引发并且执行流应该进入 except 块。我说得对吗?
但是它没有被引发,执行流程继续到下一行:
for body_item in body_dic.keys():
然后引发以下异常:
AttributeError
("'unicode' object has no attribute 'keys'",)
如果我更改上面的 except 块以捕获通用异常,我就会知道:
except Exception as e:
print "futt gayaa"
print type(e).__name__
print e.args
body_string = item.get('body')
请帮助我理解这一点。在我看来,当第一个异常被引发时(在我们的例子中应该是 ValueError Exception),控制流应该进入 catch 块。为什么它转到下一行代码,然后当 Attribute Exception 被引发时它是否被捕获。
假设如您所写
print item.get("body")
returns字面意思
"1211V1"
那么引号就是字符串本身的一部分。
所以你实际上调用了
json.loads('"1211V1"')
您正在加载 JSON 字符串文字的位置——完全有效。然后,当然,你会得到一个 AttributeError
试图在 unicode
对象上调用 .keys()
。
如果您使用 print
来调试问题,它可能会以这种方式误导您——如果您真的想确定您正在处理的对象是什么,那么最好经常这样做遇到问题,写 print(repr(obj))
。在这种情况下,它会告诉您 item.get("body")
是 u'"1211V1"'
.
所以你的问题是你有一个字典序列,它的属性 body 是一个 JSON 字符串。它可能是:
"1211V1"
或:
{
"points_token_id":"327727a0-3909-4132-8fa2-ee45146add1e"
}
这是一个 JSON 字符串或一个 JSON 对象。通过 json.loads()
ing 这个字符串,你总是得到一个有效的 Python 值,分别是 Python str
或 Python dict
。你想要做的是检测它是一个还是另一个:
json_body = json.loads(item['body'])
if type(json_body) is dict:
for key, value in json_body.items():
json_body[key] = {'required': True, 'type': 'resource', 'value': value}
body_string = json.dumps(json_body)
else:
pass # Handle the "1211V1"
item
是一个python字典
print item.get('body')
在某些情况下给出以下输出:
"1211V1"
然而,item.get('body') 大多具有以下格式的 unicode 字符串:
u'{"points_token_id":"327727a0-3909-4132-8fa2-ee45146add1e"}'
我需要将上面的 unicode 字符串转换为 python 字典。所以我这样做:
try:
body_dic = json.loads(item.get('body'))
body_string = ""
for body_item in body_dic.keys():
body_string += body_item + ": {'required': True, 'type': 'resource', 'value': " + str(body_dic.get('body_item')) + "\n\t\t\t\t"
except Exception as e:
print "futt gayaa"
print type(e).__name__
print e.args
body_string = item.get('body')
然后是一堆代码。所以在上面那一刻 item.get('body') 结果是 "1211V1" a ValueError Exception 应该被引发并且执行流应该进入 except 块。我说得对吗?
但是它没有被引发,执行流程继续到下一行:
for body_item in body_dic.keys():
然后引发以下异常:
AttributeError ("'unicode' object has no attribute 'keys'",)
如果我更改上面的 except 块以捕获通用异常,我就会知道:
except Exception as e:
print "futt gayaa"
print type(e).__name__
print e.args
body_string = item.get('body')
请帮助我理解这一点。在我看来,当第一个异常被引发时(在我们的例子中应该是 ValueError Exception),控制流应该进入 catch 块。为什么它转到下一行代码,然后当 Attribute Exception 被引发时它是否被捕获。
假设如您所写
print item.get("body")
returns字面意思
"1211V1"
那么引号就是字符串本身的一部分。
所以你实际上调用了
json.loads('"1211V1"')
您正在加载 JSON 字符串文字的位置——完全有效。然后,当然,你会得到一个 AttributeError
试图在 unicode
对象上调用 .keys()
。
如果您使用 print
来调试问题,它可能会以这种方式误导您——如果您真的想确定您正在处理的对象是什么,那么最好经常这样做遇到问题,写 print(repr(obj))
。在这种情况下,它会告诉您 item.get("body")
是 u'"1211V1"'
.
所以你的问题是你有一个字典序列,它的属性 body 是一个 JSON 字符串。它可能是:
"1211V1"
或:
{
"points_token_id":"327727a0-3909-4132-8fa2-ee45146add1e"
}
这是一个 JSON 字符串或一个 JSON 对象。通过 json.loads()
ing 这个字符串,你总是得到一个有效的 Python 值,分别是 Python str
或 Python dict
。你想要做的是检测它是一个还是另一个:
json_body = json.loads(item['body'])
if type(json_body) is dict:
for key, value in json_body.items():
json_body[key] = {'required': True, 'type': 'resource', 'value': value}
body_string = json.dumps(json_body)
else:
pass # Handle the "1211V1"