2013-04-22 15 views
21

Se eseguire il codice:Cattura KeyError in Python

connection = manager.connect("I2Cx") 

il programma si blocca e segnala un KeyError perché I2Cx non esiste (dovrebbe essere I2C).

Ma se faccio:

try: 
    connection = manager.connect("I2Cx") 
except Exception, e: 
    print e 

E non stampa nulla per l'e. Mi piacerebbe essere in grado di stampare l'eccezione che è stata generata. Se provo la stessa cosa con un'operazione di divisione per zero, viene catturato e riportato correttamente in entrambi i casi. Cosa mi manca qui?

+4

Nota a margine: a meno che non sia necessario il pre-2.5 compatibilità, dovresti scrivere 'except Exception as e:' invece di 'except Exception, e:'. – abarnert

risposta

4

È necessario consultare la documentazione di qualunque libreria stia generando l'eccezione, per vedere come ottenere un messaggio di errore dalle eccezioni.

In alternativa, un buon modo per eseguire il debug di questo genere di cose è da dire:

except Exception, e: 
    print dir(e) 

per vedere quali proprietà e ha - probabilmente trovare ha una proprietà message o simili.

0

Non penso pitone dotato di una chiusura :)

try: 
    connection = manager.connect("I2Cx") 
except Exception, e: 
    print e 
34

Se si tratta di sollevare un KeyError con alcun messaggio, allora non stamperà nulla. Se lo fai ...

try: 
    connection = manager.connect("I2Cx") 
except Exception, e: 
    print repr(e) 

... avrai almeno il nome della classe di eccezione.

Una migliore alternativa è quella di utilizzare più except blocchi, e solo 'catturare' le eccezioni che si intende gestire ...

try: 
    connection = manager.connect("I2Cx") 
except KeyError, e: 
    print 'I got a KeyError - reason "%s"' % str(e) 
except IndexError, e: 
    print 'I got an IndexError - reason "%s"' % str(e) 

Non ci sono motivi validi per catturare tutte le eccezioni, ma si dovrebbe quasi sempre ri .com: loro se lo fai ...

try: 
    connection = manager.connect("I2Cx") 
except KeyError, e: 
    print 'I got a KeyError - reason "%s"' % str(e) 
except: 
    print 'I got another exception, but I should re-raise' 
    raise 

... perché probabilmente non si vuole gestire KeyboardInterrupt se l'utente preme CTRL-C, nè SystemExit se il try -block chiamate sys.exit().

+0

Penso che il suo problema fosse più la parte "catch" che la stampa effettiva ... ma sì, questo risolve anche questo problema –

+1

@JoranBeasley Il "catch" è più probabile un errore di battitura, poiché l'OP avrebbe avuto un errore differente quello è stato nel codice reale. – Aya

+1

+1. Ma 'KeyboardInterrupt' e' SystemExit' non sono sottoclassi di 'Exception', quindi l'ultima frase è fuorviante. – abarnert

2

Si può anche provare ad usare get(), ad esempio:

connection = manager.connect.get("I2Cx") 

che non sollevare un KeyError nel caso in cui la chiave non esiste.

È anche possibile utilizzare il secondo argomento per specificare il valore predefinito, se la chiave non è presente.

0

Se non si desidera gestire l'errore basta NoneType e utilizzare get() es .:

manager.connect.get("") 
0

Prova di stampa (e.Message) questo dovrebbe essere in grado di stampare il tuo eccezione.

try: 
    connection = manager.connect("I2Cx") 
except Exception, e: 
    print(e.message) 
Problemi correlati