Python 101 (part 8): An Exceptionally Clever Snake - Bad Boys (
Page 6 of 9 )
Most of what you've just learned also applies to Python's other
exception-handlng construct, the "try-finally" statement. The "try-finally"
statement block differs from "try-except-else" in that it merely detects
errors; it does not provide for a mechanism to resolve them. It is
typically used to ensure that certain statements are always executed when
an error (regardless of type) is encountered.
The "try-finally" statement block looks like this:
try:
execute this block
finally:
if exceptions generated, execute this block
If an exception is encountered when running the code within the "try"
block, Python will stop execution at that point; jump to the "finally"
block; execute the statements within it; and then pass the exception
upwards, to the parent "try" block, if one exists, or to the default
handler, which terminates the program and displays a stack trace.
Here's an example:
#!/usr/bin/python
dessert = ('apple pie', 'chocolate fudge cake', 'icecream')
try:
# generate error by accessing index out of range
print dessert[10]
finally:
print "Something bad happened"
When this program runs, an IndexError exception will be generated and the
"finally" block will execute, printing an error message. Control will then
flow to the parent exception handler, which is the Python interpreter in
this case; the interpreter will terminate the program and print a stack
trace.
$ dessert.py
Something bad happened
Traceback (innermost last):
File "dessert.py", line 7, in ?
print dessert[10]
IndexError: tuple index out of range
Since "try-finally" blocks simply detect errors, passing the resolution
buck upwards to the parent "try" block, it's possible to nest them within
"try-except-else" blocks. Take a look:
#!/usr/bin/python
try:
dessert = ('apple pie', 'chocolate fudge cake', 'icecream')
try:
# generate error by accessing index out of range
print dessert[10]
finally:
print "Something bad happened"
except IndexError:
print "You attempted to access a non-existent element. Bad boy!"
except NameError:
print "You attempted to access a non-existent object. What are you
thinking?"
Here's what'll happen when you run it:
Something bad happened
You attempted to access a non-existent element. Bad boy!