代码之家  ›  专栏  ›  技术社区  ›  qre0ct

未正确捕获Python ValueError异常

  •  0
  • qre0ct  · 技术社区  · 7 年前

    item python字典

    print item.get('body')
    

    在某些情况下提供以下输出:

    “1211V1”

    然而 项目获取('正文') 大多具有以下格式的unicode字符串:

    u{“points\u token\u id”:“327727a0-3909-4132-8fa2-ee45146add1e”}

    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')
    

    然后是一堆代码。所以在上述时刻 项目获取('正文') 结果是 ValueError异常 并且执行流应该进入 除了 块我说得对吗?

    然而,它不会被提升,执行流继续进入下一行,即:

    for body_item in body_dic.keys():
    

    然后引发以下异常:

    属性错误 (“'unicode'对象没有属性‘keys’”,)

    如果我改变了 除了

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

    请帮我理解这一点。在我看来,在第一个例外被提出的那一刻(在我们的情况下应该是 ValueError异常 )控制流应进入捕捉块。为什么它会转到下一行代码,然后当 属性异常 被举起,它会被抓住。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Iguananaut    7 年前

    print item.get("body")
    

    逐字返回

    "1211V1"
    

    那么引号就是字符串本身的一部分。

    json.loads('"1211V1"')
    

    在这里加载JSON字符串文字——完全有效。然后,当然,你会得到一个 AttributeError 因为我想打电话 .keys() unicode 对象

    如果您正在使用 print 为了调试一个问题,它可能会以这种方式误导您——如果您真的想确定您遇到问题的对象是什么,那么您最好经常编写 print(repr(obj)) item.get("body") u'"1211V1"' .

        2
  •  0
  •   Adirio Raed Shomali    7 年前

    所以你的问题是你有一个dict序列,它的属性体是一个JSON字符串。它可以是:

    "1211V1"
    

    或:

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

    json.loads() 通过使用这个字符串,您总是会得到一个有效的Python值,或者是一个Python值 str 或者蟒蛇 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"