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

Какой ключ не удалось выполнить в 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")
4b9b3361

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