Sometimes, you may want something to occur regardless of whatever exception happened, for example, if you have to clean up some resources.
The finally
block of a try
clause will happen regardless of whether any exceptions were raised.
resource = allocate_some_expensive_resource()
try:
do_stuff(resource)
except SomeException as e:
log_error(e)
raise # re-raise the error
finally:
free_expensive_resource(resource)
This pattern is often better handled with context managers (using the with
statement).