从Python KeyError异常中获取密钥名称

时间:2012-12-06 14:18:47

标签: python exception

我想从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']}>

虽然我只想要'key2'

6 个答案:

答案 0 :(得分:50)

您可以使用e.args

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

来自docs

  

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

中的参数

答案 1 :(得分: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

答案 2 :(得分:2)

异常对象将是缺少的键

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

答案 3 :(得分: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,违规密钥:'key2'

答案 4 :(得分: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]

或类似的正则表达式?

答案 5 :(得分:-3)

由于您的字典实际上是QueryDict,因此返回不同的错误消息,您需要解析异常消息以返回单引号中的第一个单词:

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