In this concluding article of the Python 101 series, find out howto use Python's exception-handling routines to trap and resolve programerrors, learn to generate and use custom error messages, and get acquainteda bunch of useful (and free!) Python resources online.
If one exception handler is nested within another, Python typically usesthe one closest to where the exception occurs. To illustrate this, considerthe following code snippet:
#!/usr/bin/python
# nested_handlers.py
def popeye():
try:
olive()
except NameError:
print "Error in popeye"
try:
popeye()
except NameError:
print "Error in main"
In this case, there are three exception handlers defined for the same typeof exception. The outermost one is in the main program body, the next iswithin the popeye() function called from the main script, and the third iswithin the olive() function called by popeye().
When olive() runs, it generates a "NameError" exception, which isimmediately handled by its own "try" block.
$ nested_handlers.py
Error in olive
However, if olive() didn't have a "try" block, or its "try" block didn'taccount for "NameError" exceptions,
#!/usr/bin/python
def popeye():
try:
olive()
except NameError:
print "Error in popeye"
def olive():
print someUnnamedVar
try:
popeye()
except NameError:
print "Error in main"
the exception would be passed up to the previous level, the callingpopeye() function, which would generate
$ nested_handlers.py
Error in popeye
If popeye()'s exception handler didn't have the ability to handle theexception, the exception would move up even further, to the main body ofthe script,
#!/usr/bin/python
def popeye():
try:
olive()
# this wouldn't handle NameError
except IndexError:
print "Error in popeye"
def olive():
print someUnnamedVar
try:
popeye()
except NameError:
print "Error in main"
which would result in
$ nested_handlers.py
Error in main
And if there weren't any handlers capable of resolving the error,
#!/usr/bin/python
def popeye():
olive()
def olive():
print someUnnamedVar
popeye()
the exception would be processed by the default handlers, which would killthe script and print a stack trace.
Traceback (innermost last):
File "./test.py", line 9, in ?
popeye()
File "./test.py", line 4, in popeye
olive()
File "./test.py", line 7, in olive
print someUnnamedVar
NameError: someUnnamedVar