从Python KeyError异常获取密钥名

从Python KeyError异常获取密钥名,python,exception,Python,Exception,我想从PythonKeyError异常中获取密钥名称: 例如: 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[m

我想从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'”
(“,”中未找到键“key2”)
在中找不到键“key2”

虽然我只需要“key2”

但您可以使用
e.args

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
[53]: try:
    x2 = myDict['key2']
except KeyError as e:    
    print e.args[0]
   ....:     
key2
从:

except子句可以在异常名称(或)之后指定变量 元组)。该变量绑定到异常实例,并使用 存储在
instance.args中的参数


异常包含有关缺少密钥的信息,例如,您可以打印它:

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

对于KeyErrors,的第二个元素(索引1)保存键:

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

KeyError,有问题的键:“key2”


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

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

这仅仅是为了记录日志,还是你真的打算用这个键做些什么?你可以看到,如果我使用args[0],我会从元组中得到第一个元素,这与我打印e.message时得到的相同。你使用的是哪个版本的Python?在我的Python解释器中运行代码块时,在打印异常时不会打印出那么长的消息,只打印键名(这是所有答案所说的)。显然你的不一样!我使用Python2.7,我认为这是不同的,因为我的代码在django视图中。如果我使用ipython,我得到的结果与您所有的错误相同。您显示的错误表明这是一个QueryDict,一个Django构造,而不是一个普通的Python字典。不幸的是,我不熟悉Django,所以不知道QueryDict中的KeyError是否与Python dict的行为相同;这是你可能想调查的事情。我得到的结果与我使用打印的结果相同。这个问题是在我提供了这个答案后编辑的。我目前对Django不太了解,所以不知道这是否适用,尽管我认为应该。@yossi:请看我对QueryDict问题的评论。我想也许有一种方法没有解决方法,但如果我找不到,我会用它,谢谢!这是不必要的复杂、缓慢、内存+CPU无效且将来容易出错。避开它!异常对象不是缺少的键。它是exceptions.KeyError类型的对象,可能会字符串化为缺少键的表示形式。在Python 2.x中可能是这种情况,但在Python 3中不起作用,因为“message”已被弃用并删除: