2014-04-17 10 views
33

Wenn ich eine KeyError abfange, wie kann ich feststellen, welche Suche fehlgeschlagen ist?Welcher Schlüssel ist in Python KeyError fehlgeschlagen?

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

Da Sie auf den Schlüssel verzweigen müssen, der trotzdem fehlgeschlagen ist, ist es wahrscheinlich klarer, jede Suche in eine separate "try" -Anweisung zu setzen. – chepner

Antwort

52

Nehmen Sie die aktuelle Ausnahme (habe ich es as e in diesem Fall); dann für eine KeyError das erste Argument ist der Schlüssel, der die Ausnahme ausgelöst. Deshalb können wir tun:

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

Damit haben Sie die säumigen Schlüssel in cause gespeichert.

Es sollte beachtet werden, dass e.message in Python 2 funktioniert, aber nicht in Python 3, daher sollte es nicht verwendet werden.

+2

Danke. Ich nehme an, das ist nirgendwo dokumentiert? Ich konnte es in den Python-Dokumenten nicht finden. – QuestionC

+2

@QuestionC ['BaseException.args'] (https://docs.python.org/3.4/library/exceptions.html#BaseException.args) ist dokumentiert, aber nicht detailliert genug, so dass seine Verwendung offensichtlich ist. –

-2

Wenn Sie importieren die sys Modul Sie Ausnahme-Info mit sys.exc_info()

wie diese bekommen:

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

@Alex Thorntons Antwort ist viel einfacher und beantwortet die Frage direkter. By the way, da dies ist downvoted, ist etwas grundsätzlich falsch mit meinem Ansatz? Ich habe diese Methode verwendet und möchte sie nicht verwenden, wenn sie Probleme verursacht. Hilf mir :) – jshanley

+0

Ich sehe keinen Grund für den Downvote. Die Syntax für die Erfassung einer Ausnahme vor Python 2.6 war weniger als klar, daher war der explizite Aufruf von 'sys.exc_info()' ein vernünftiger Ansatz. – chepner

+2

Kein Downvoter, aber: es ist komplizierter als 'außer Foo als e', und es ist eine Race-Bedingung in Multithread-Code. Was passiert, wenn zwei Threads einen KeyError auslösen, bevor einer von ihnen 'sys.exc_info' aufrufen kann? Beide Threads würden die gleiche Ausgabe sehen, also könnte einer von ihnen falsch liegen. Die Syntax "außer Foo as e" ist eine atomare Operation. –

2

Nicht sicher, ob Sie Module verwenden, Sie zu unterstützen - wenn die JSON in kommt Als Diktat kann man dict.get() auf ein nützliches Ende verwenden.

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() zwei Argumente - die erste die key Sie wollen zu sein, der zweite wobei der Wert zurück, wenn die Schlüssel nicht existiert.

Verwandte Themen