Which key failed in Python KeyError?

Python Programming

Question or problem about Python programming:

If I catch a KeyError, how can I tell what lookup failed?

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")

How to solve the problem:

Solution 1:

Take the current exception (I used it as e in this case); then for a KeyError the first argument is the key that raised the exception. Therefore we can do:

except KeyError as e:  # One would do it as 'KeyError, e:' in Python 2.
    cause = e.args[0]

With that, you have the offending key stored in cause.

It should be noted that e.message works in Python 2 but not Python 3, so it shouldn’t be used.

Solution 2:

Not sure if you’re using any modules to assist you – if the JSON is coming in as a dict, one can use dict.get() towards a useful end.

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() takes two arguments – the first being the key you want, the second being the value to return if that key does not exist.

Solution 3:

If you import the sys module you can get exception info with sys.exc_info()

like this:

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")

Hope this helps!