Exception Gotchas
There isn’t much to trip over here, but here are a few general pointers on exception use.
Exceptions Match by Identity, Not Equality
As we’ve seen, when an exception is raised (by you or by Python
itself), Python searches for the most recently entered
try
statement with a
matching
except
clause, where matching means the same
string object, the same class object, or a superclass of the raised
class object. It’s important to notice that matching is
performed by identity, not equality. For instance, suppose we define
two string objects we want to raise as exceptions:
>>>ex1 = "spam"
>>>ex2 = "spam"
>>> >>>ex1 == ex2, ex1 is ex2
(1, 0)
Applying the ==
test returns true (1) because they
have equal values, but is
returns false (0) since
they are two distinct string objects in memory. Now, an
except
clause that names the same string object
will always match:
>>>try:
...raise ex1
...except ex1:
...print 'got it'
... got it
But one that lists an equal but not identical object will fail:
>>>try:
...raise ex1
...except ex2:
...print 'Got it'
... Traceback (innermost last): File "<stdin>", line 2, in ? spam
Here, the exception isn’t caught, so Python climbs to the top
level of the process and prints a stack trace and the exception
automatically (the string "spam"
). For class
exceptions, the behavior is similar, but Python generalizes the
notion of exception matching to include superclass relationships.
Catching Too Much?
Because Python lets you pick and choose which ...
Get Learning Python now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.