2013-04-22 16 views
21

Jeśli uruchomić kod:Złap KeyError w Pythonie

connection = manager.connect("I2Cx") 

awarii programu i zgłasza KeyError ponieważ I2Cx nie istnieje (powinien być I2C).

Ale jeśli to zrobię:

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

Nie ma nic za e wydrukować. Chciałbym móc wydrukować wyjątek, który został zgłoszony. Jeśli spróbuję tego samego z operacją dzielenia przez zero, zostanie ona złapana i zgłoszona prawidłowo w obu przypadkach. Czego tu mi brakuje?

+4

Nota boczna: O ile nie potrzebujesz pre-2.5 kompatybilności, powinieneś napisać 'except Exception as e:' zamiast 'except Exception, e:'. – abarnert

Odpowiedz

4

Powinieneś zapoznać się z dokumentacją jakiejkolwiek biblioteki, która rzuca wyjątek, aby zobaczyć, jak uzyskać komunikat o błędzie ze swoich wyjątków.

Alternatywnie, dobrym sposobem na debugowanie tego rodzaju rzeczy, to znaczy:

except Exception, e: 
    print dir(e) 

zobaczyć jakie właściwości e posiada - prawdopodobnie znajdziesz to ma właściwość message lub podobny.

0

nie sądzę Python posiada zaczep :)

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

Jeśli jest podniesienie KeyError bez wiadomości, to nic nie drukuje. Jeśli to zrobisz ...

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

... otrzymasz co najmniej nazwę klasy wyjątków.

Lepszym rozwiązaniem jest użycie wielu except klocki, i tylko „połów” wyjątki, które mają być obsłużyć ...

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) 

Istnieją uzasadnione powody, aby złapać wszystkie wyjątki, ale prawie zawsze należy ponownie -raise je, jeśli nie ...

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 

... bo pewnie nie chcą obsługiwać KeyboardInterrupt jeśli użytkownik naciśnie CTRL-C, ani SystemExit jeśli try -blok wzywa sys.exit().

+0

Myślę, że jego problem był bardziej częścią "catch" niż faktycznym drukowaniem ... ale tak to rozwiązuje ten problem. –

+1

@JoranBeasley "catch" jest bardziej prawdopodobnym literówka, ponieważ OP miałby inny błąd które były w prawdziwym kodzie. – Aya

+1

+1. Ale 'KeyboardInterrupt' i' SystemExit' nie są podklasami 'Exception', więc twoje ostatnie zdanie jest mylące. – abarnert

2

Można również spróbować użyć get(), na przykład:

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

które nie podniesie KeyError w przypadku, gdy klucz nie istnieje.

Możesz również użyć drugiego argumentu, aby określić domyślną wartość, jeśli klucz nie występuje.

0

Jeśli nie chcesz, aby obsłużyć błąd tylko NoneType i używać get() np .:

manager.connect.get("") 
0

Spróbuj wydrukować (e.message) to powinny być w stanie wydrukować wyjątek.