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?
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()
.
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)
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.
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.
I dont think python has a catch :)
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
If you don't want to handle error just NoneType
and use get()
e.g.:
manager.connect.get("")
Try print(e.message) this should be able to print your exception.
try:
connection = manager.connect("I2Cx")
except Exception, e:
print(e.message)
来源:https://stackoverflow.com/questions/16154032/catch-keyerror-in-python