Подтвердить что ты не робот

Получить ключевое имя из исключения Python KeyError

Я хотел бы получить имя ключа из исключения 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"

4b9b3361

Ответ 1

Поскольку ваш словарь на самом деле является QueryDict и поэтому возвращает другое сообщение об ошибке, вам нужно будет разобрать сообщение об исключении, чтобы вернуть первое слово в одинарных кавычках:

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

Ответ 2

Вы можете использовать e.args:

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

Из docs:

Предложение except может указывать переменную после имени исключения (или кортеж). Переменная привязана к экземпляру исключения с аргументы, хранящиеся в instance.args

Ответ 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

Ответ 4

Объектом исключения будет отсутствующий ключ

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

Ответ 5

Для KeyErrors второй элемент (индекс 1) sys.exc_info() содержит ключ:

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

Вывод:

KeyError, оскорбительный ключ: 'key2'

Ответ 6

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

в этом случае напечатает key2

отредактировано для добавления...

не знакомы с django, но если e.message является последовательным (и последовательно строкой), вы можете извлечь ключ, используя обычные методы string, что-то вроде.

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

или аналогичная вещь регулярного выражения?