2012-12-06 10 views
13

Vorrei ottenere il nome chiave dal un'eccezione Python KeyError:Get nome della chiave da un'eccezione Python KeyError

Ad esempio:

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] 

ho già provato questo

print e 
print e.args 
print e.message 

il mio codice è dentro la vista di Django!

se uso ipython per esempio e provo e.arg o e.message funziona correttamente. ma poi la provo mentre all'interno una vista Django ottengo questo risultato:

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

mentre io voglio solo il 'key2'

+0

E 'solo per la registrazione o stai effettivamente facendo qualcosa con la chiave? – NPE

+1

usa semplicemente 'e.args [0]'. –

+0

puoi vedere che se uso args [0] ottengo il primo elemento dalla tupla che è lo stesso che ottengo quando stampo e.message – yossi

risposta

0

Come il dizionario è in realtà un QueryDict, e quindi restituisce un messaggio di errore diverso, sarà necessario analizzare il messaggio di eccezione per restituire la prima parola tra virgolette singole:

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

ho pensato che forse c'è un modo senza una soluzione, ma se non riesco a trovarne uno userò questo, grazie! – yossi

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

in questo caso stamperà key2

modificati aggiungere ...

non ha familiarità con Django ma se il e.message è coerente (e coerentemente una stringa) è possibile estrarre la chiave usando normali metodi di stringa, qualcosa del genere.

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

o una cosa di regex simile?

+0

se uso ipython ottengo lo stesso risultato di te ma all'interno di una vista django ottengo il risultato che ho scritto nella mia risposta – yossi

+0

hai provato a operare direttamente sul messaggio di errore? operazioni a stringa o regex? –

+0

userò @Jonathan Cairns answer 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

È possibile utilizzare e.args:

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

Dal docs:

La clausola except può specificare una variabile dopo il nome dell'eccezione (o tuple). La variabile è limitata al caso di un'eccezione alle argomenti memorizzati nella instance.args

+2

@yossi, questa dovrebbe essere la risposta accettata. –

+0

ok per ** python2 ** e ** python3 ** – maxkoryukov

+0

@yossi, questa dovrebbe essere la risposta accettata [1] – maxkoryukov

2

l'eccezione oggetto sarà la chiave mancante

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

Per KeyErrors, il secondo elemento (indice 1) della sys.exc_info() tiene la chiave:

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

uscita:

KeyError, chiave di offendere: 'key2'

+0

ottengo lo stesso risultato come se usassi print e – yossi

+1

La domanda è stata modificata dopo aver fornito questa risposta. Al momento non sono a conoscenza di Django, quindi non so se funzionerà o meno all'interno di quel contesto, anche se penso che dovrebbe. – GreenMatt

+0

@yossi: Vedere il mio commento alla domanda su QueryDict. – GreenMatt