it-swarm.com.de

Fangen Sie KeyError in Python ab

Wenn ich den Code ausführte:

connection = manager.connect("I2Cx")

Das Programm stürzt ab und meldet einen KeyError, da I2Cx nicht vorhanden ist (es sollte I2C sein).

Aber wenn ich es mache:

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

Es wird nichts für e gedruckt. Ich möchte in der Lage sein, die geworfene Ausnahme auszudrucken. Wenn ich dasselbe mit einer Division durch Nulloperation versuche, wird es in beiden Fällen richtig erfasst und gemeldet. Was fehlt mir hier?

27
spizzak

Wenn ein KeyError ohne Meldung ausgegeben wird, wird nichts gedruckt. Wenn Sie tun...

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

... Sie erhalten mindestens den Namen der Ausnahmeklasse.

Eine bessere Alternative ist, mehrere except-Blöcke zu verwenden und nur die Ausnahmen zu "fangen", die Sie behandeln möchten ...

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

Es gibt gute Gründe, alle Ausnahmen zu erfassen, aber Sie sollten sie fast immer wieder erhöhen, wenn Sie dies tun ...

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

... weil Sie wahrscheinlich nicht mit KeyboardInterrupt umgehen wollen, wenn der Benutzer CTRL-C drückt, oder SystemExit, wenn der try- Block sys.exit() aufruft.

47
Aya

Ich benutze Python 3.6 und ein Komma zwischen Exception und e funktioniert nicht. Ich muss die folgende Syntax verwenden (nur für alle, die sich fragen)

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print(e.message)
12
ajpieri

Sie sollten die Dokumentation der Bibliothek lesen, die die Ausnahme auslöst, um zu erfahren, wie Sie eine Fehlermeldung aus ihren Ausnahmen erhalten.

Alternativ können Sie zum Debuggen dieser Art Folgendes sagen:

except Exception, e:
    print dir(e)

um herauszufinden, welche Eigenschaften e hat, werden Sie wahrscheinlich feststellen, dass es eine message-Eigenschaft oder ähnliches hat.

5
RichieHindle

Sie können auch versuchen, get() zu verwenden, zum Beispiel:

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

was keine KeyError erhöht, falls der Schlüssel nicht existiert.

Sie können auch das zweite Argument verwenden, um den Standardwert anzugeben, wenn der Schlüssel nicht vorhanden ist.

2
kenorb

Versuchen Sie es mit print (e.message), damit Ihre Ausnahme gedruckt werden kann.

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

Ich glaube nicht, dass Python einen Haken hat :)

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

Wenn Sie den Fehler nicht behandeln möchten, verwenden Sie einfach NoneType und verwenden Sie get()

manager.connect.get("")
0
Amrit