Catch KeyError in Python

Question:

If I run the code:

connection = manager.connect("I2Cx")

The program crashes and reports a KeyError because I2Cx doesn’t exist (it should be I2C).

But if I do:

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

It doesn’t print anything for e. I would like to be able to print the exception that was thrown. If I try the same thing with a divide by zero operation it is caught and reported properly in both cases. What am I missing here?

Asked By: spizzak

||

Answers:

You should consult the documentation of whatever library is throwing the exception, to see how to get an error message out of its exceptions.

Alternatively, a good way to debug this kind of thing is to say:

except Exception, e:
    print dir(e)

to see what properties e has – you’ll probably find it has a message property or similar.

Answered By: RichieHindle

I dont think python has a catch 🙂

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

If it’s raising a KeyError with no message, then it won’t print anything. If you do…

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

…you’ll at least get the exception class name.

A better alternative is to use multiple except blocks, and only ‘catch’ the exceptions you intend to handle…

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)

There are valid reasons to catch all exceptions, but you should almost always re-raise them if you do…

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

…because you probably don’t want to handle KeyboardInterrupt if the user presses CTRL-C, nor SystemExit if the try-block calls sys.exit().

Answered By: Aya

You can also try to use get(), for example:

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

which won’t raise a KeyError in case the key doesn’t exist.

You may also use second argument to specify the default value, if the key is not present.

Answered By: kenorb

If you don’t want to handle error just NoneType and use get()
e.g.:

manager.connect.get("")
Answered By: Amrit

Try print(e.message) this should be able to print your exception.

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

I am using Python 3.6 and using a comma between Exception and e does not work. I need to use the following syntax (just for anyone wondering)

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print(e.message)
Answered By: ajpieri
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.