2012-12-06 34 views
13

我想从Python KeyError例外拿到钥匙名称:获取键名

例如:

myDict = {'key1':'value1'} 
try: 
    x1 = myDict['key1'] 
    x2 = myDict['key2'] 
except KeyError as e: 
    # here i want to use the name of the key that was missing which is 'key2' in this example 
    print error_msg[missing_key] 

我已经尝试过这种

print e 
print e.args 
print e.message 

我的代码在Django视图中!

如果我使用ipython为例,并尝试e.arg或e.message它工作正常。 但后来我尝试它,而Django视图中我得到这个结果:

"Key 'key2' not found in <QueryDict: {u'key1': [u'value']}>" 
("Key 'key2' not found in <QueryDict: {u'key1': [u'value']}>",) 
Key 'key2' not found in <QueryDict: {u'key1': [u'value']}> 

,而我只是想在这种情况下,“密钥2”

+0

仅仅是为了记录,或者你是否真的要用钥匙做点什么? – NPE

+1

只需使用'e.args [0]'。 –

+0

你可以看到,如果我使用args [0],我从元组中获得第一个元素,这与我在打印e.message时得到的元素相同 – yossi

回答

0

至于你的字典实际上是QueryDict,因此,返回不同的错误信息,则需要分析异常消息,以在单引号返回的第一个字:

import re 
#... 
except KeyError as e: 
    m = re.search("'([^']*)'", e.message) 
    key = m.group(1) 
+2

我想也许有没有解决方法的方法,但如果我找不到一个我会用这个,谢谢! – yossi

0
myDict = {'key1':'value1'} 
try: 
    x1 = myDict['key1'] 
    x2 = myDict['key2'] 
except KeyError as e: 
    print e.message 

将打印key2

编辑添加...

不熟悉django,但如果e.message是一致的(并且始终是一个字符串),您可以使用普通字符串方法提取密钥,如。

my_non_key = e.message.split(" ")[1] 

或类似的正则表达式的东西?

+0

如果使用ipython我得到的结果与u相同,但在django视图中我得到结果我写在我的答案 – yossi

+0

您是否尝试过直接对错误消息进行操作?字符串操作或正则表达式? –

+0

我将使用@Jonathan凯恩斯答案http://stackoverflow.com/a/13746232/486209 – yossi

3
myDict = {'key1':'value1'} 
try: 
    x1 = myDict['key1'] 
    x2 = myDict['key2'] 
except KeyError as e: 
    # here i want to use the name of the key that was missing which is 'key2' in this example 
    print "missing key in mydict:", e.message 
28

您可以使用e.args

[53]: try: 
    x2 = myDict['key2'] 
except KeyError as e:  
    print e.args[0] 
    ....:  
key2 

docs

的except子句中的名称(或 元组)后,可以指定一个变量。变量绑定到一个异常实例与存储在instance.args

+2

@yossi,这应该是公认的答案。 –

+0

好的** python2 **和** python3 ** – maxkoryukov

+0

@yossi,这应该是接受的答案[1] – maxkoryukov

2

的异常对象的 参数将是缺少关键

a={"a":1} 
try: 
    print(a["b"]) 
except KeyError as e: 
    print(e)  #prints "b" 
1

对于KeyErrors,所述第二元件的sys.exc_info()(索引1)成立的关键:

import sys 
try: 
    x1 = myDict['key1'] 
    x2 = myDict['key2'] 
except KeyError: 
    print 'KeyError, offending key:', sys.exc_info()[1] 

输出:

KeyError异常,得罪键:“键2”

+0

我得到了同样的结果,如果我使用打印e – yossi

+1

这个问题是在我提供这个答案后编辑的。我目前不熟悉Django,所以不知道在这种情况下这是否会起作用,尽管我认为它应该。 – GreenMatt

+0

@yossi:查看我对有关QueryDict的问题的评论。 – GreenMatt