Какой ключ не удалось выполнить в Python KeyError?
Если я поймаю KeyError
, как я могу определить, какой поиск не удалось?
def poijson2xml(location_node, POI_JSON):
try:
man_json = POI_JSON["FastestMan"]
woman_json = POI_JSON["FastestWoman"]
except KeyError:
# How can I tell what key ("FastestMan" or "FastestWoman") caused the error?
LogErrorMessage ("POIJSON2XML", "Can't find mandatory key in JSON")
Ответы
Ответ 1
Возьмите текущее исключение (я использовал его as e
в этом случае); то при a KeyError
первый аргумент - это ключ, который вызвал исключение. Поэтому мы можем сделать:
except KeyError as e: # One would do it as 'KeyError, e:' in Python 2.
cause = e.args[0]
При этом у вас есть оскорбительный ключ, хранящийся в cause
.
Следует отметить, что e.message
работает в Python 2, но не Python 3, поэтому его не следует использовать.
Ответ 2
Не уверен, что если вы используете какие-либо модули, чтобы помочь вам - если JSON входит в качестве dict, то можно использовать dict.get()
к полезному концу.
def POIJSON2DOM (location_node, POI_JSON):
man_JSON = POI_JSON.get("FastestMan", 'No Data for fastest man')
woman_JSON = POI_JSON.get("FastestWoman", 'No Data for fastest woman')
#work with the answers as you see fit
dict.get()
принимает два аргумента: первый из них - key
, второй - значение, возвращаемое, если этот ключ не существует.
Ответ 3
Если вы импортируете модуль sys
, вы можете получить информацию об исключении с помощью sys.exc_info()
вот так:
def POIJSON2DOM (location_node, POI_JSON):
try:
man_JSON = POI_JSON["FastestMan"]
woman_JSON = POI_JSON["FastestWoman"]
except KeyError:
# you can inspect these variables for error information
err_type, err_value, err_traceback = sys.exc_info()
REDI.LogErrorMessage ("POIJSON2DOM", "Can't find mandatory key in JSON")