2012-12-06 16 views
13

Chciałbym uzyskać nazwę klucza od Python KeyError wyjątek:Uzyskaj nazwę klucza z wyjątkiem Python KeyError

Na przykład:

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] 

Próbowałem już tego

print e 
print e.args 
print e.message 

mój kod jest wewnątrz widoku django!

jeśli używam ipython na przykład i wypróbuję e.arg lub e.message to działa dobrze. ale potem spróbować podczas wewnątrz widoku django uzyskać to wyniki:

"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']}> 

natomiast chcę tylko „Klawisz2”

+0

Czy to tylko do logowania, czy też zamierzasz coś zrobić za pomocą klucza? – NPE

+1

wystarczy użyć 'e.args [0]'. –

+0

widać, że jeśli używam args [0], otrzymuję pierwszy element z krotki, który jest taki sam, jaki otrzymuję, gdy drukuję e.message – yossi

Odpowiedz

0

Jak słownika jest rzeczywiście QueryDict i dlatego zwraca się inny komunikat o błędzie, trzeba będzie analizować komunikat wyjątku, aby powrócić pierwsze słowo w apostrofach:

import re 
#... 
except KeyError as e: 
    m = re.search("'([^']*)'", e.message) 
    key = m.group(1) 
+2

Myślałem, że być może istnieje sposób bez obejścia, ale jeśli nie mogę znaleźć, wykorzystam to, dzięki! – yossi

0
myDict = {'key1':'value1'} 
try: 
    x1 = myDict['key1'] 
    x2 = myDict['key2'] 
except KeyError as e: 
    print e.message 

w tym przypadku będzie drukować key2

edytowany dodać ...

Nie znasz django, ale jeśli jest to e.message jest spójny (i konsekwentnie ciąg) można wyodrębnić klucz za pomocą normalnych metod ciąg, coś w stylu.

my_non_key = e.message.split(" ")[1] 

lub coś podobnego do regex?

+0

jeśli używasz ipython i otrzymuję taki sam wynik jak ty, ale wewnątrz widoku django otrzymuję wynik napisałem w mojej odpowiedzi – yossi

+0

czy próbowałeś bezpośrednio obsługiwać komunikat o błędzie? operacje łańcuchowe lub wyrażenie regularne? –

+0

Użyję @ Jonathan Cairns Odpowiedź http://stackoverflow.com/a/13746232/486209 – yossi

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 
28

Można użyć e.args:

[53]: try: 
    x2 = myDict['key2'] 
except KeyError as e:  
    print e.args[0] 
    ....:  
key2 

Z docs:

klauzuli except może określić zmienną po nazwie wyjątków (lub krotki). Zmienna jest związana z wystąpieniem wyjątku z argumentów przechowywanych instance.args

+2

@yossi, to powinna być zaakceptowana odpowiedź. –

+0

OK dla ** python2 ** i ** python3 ** – maxkoryukov

+0

@yossi, to powinna być zaakceptowana odpowiedź [1] – maxkoryukov

2

Wyjątkiem przedmiotu będzie brak klucza

a={"a":1} 
try: 
    print(a["b"]) 
except KeyError as e: 
    print(e)  #prints "b" 
1

Na KeyErrors, 2. Element (indeks 1) z sys.exc_info() trzyma klucz:

import sys 
try: 
    x1 = myDict['key1'] 
    x2 = myDict['key2'] 
except KeyError: 
    print 'KeyError, offending key:', sys.exc_info()[1] 

wyjściowa:

KeyError, obrażając klucz: „klucz2”

+0

Mam taki sam wynik, jak gdybym użył print e – yossi

+1

Pytanie zostało zredagowane po tym, jak dostarczyłem tę odpowiedź. Nie posiadam obecnie wiedzy na temat Django, więc nie wiem, czy to zadziała, czy nie w tym kontekście, chociaż myślę, że powinno. – GreenMatt

+0

@yossi: Zobacz mój komentarz do pytania o QueryDict. – GreenMatt