Получить ключевое имя из исключения 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"
Ответы
Ответ 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]
или аналогичная вещь регулярного выражения?