Python ValueError异常未被正确捕获

时间:2017-10-23 12:51:54

标签: python exception valueerror

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”应该引发 ValueError Exception 并且执行流应该进入块之外。我是对的吗?

然而它并没有被提升,执行流程继续进入下一行:

for body_item in body_dic.keys():

然后引发以下异常:

  

AttributeError的   (“'unicode'对象没有属性'keys'”,)

我知道如果我更改上面的 except 块以捕获一般异常:

except Exception as e:
    print "futt gayaa"
    print type(e).__name__
    print e.args
    body_string = item.get('body')

请帮我理解这一点。在我看来,第一个异常被引发的那一刻(在我们的例子中应该是 ValueError Exception ),控制流应该进入catch块。为什么它会转到下一行代码,然后当属性异常被引发时会被捕获。

2 个答案:

答案 0 :(得分:2)

假设,正如你写的那样

print item.get("body")

按字面意思返回

"1211V1"

然后引号是字符串本身的一部分。

所以你有效地致电

json.loads('"1211V1"')

您正在加载JSON字符串文字 - 完全有效。然后,当然,您尝试在AttributeError对象上调用.keys()时会收到unicode

如果您使用print调试问题,可能会以这种方式误导您 - 如果您真的想确定对象是什么,那么您经常会感觉更好#39;遇到麻烦,写print(repr(obj))。在这种情况下会告诉您item.get("body")u'"1211V1"'

答案 1 :(得分:0)

所以你的问题是你有一系列的dicts,其属性主体是一个JSON字符串。它可能是:

"1211V1"

或:

{
    "points_token_id":"327727a0-3909-4132-8fa2-ee45146add1e"
}

这是一个JSON字符串或JSON对象。通过json.loads()此字符串,您始终可以获得有效的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"