I understand the concept of try: except: block or try: except: else: but I don't seem to understand purpose of the finally: block.Is there a difference between:
try:
*try something*
except:
*catch and handle error
finally:
*continue rest of the script*And:
try:
*try something*
except:
*catch and handle error
*continue rest of the script without 'finally' block*I suppose there must be some difference,but I can't find any
Videos
It makes a difference if you return early:
try:
run_code1()
except TypeError:
run_code2()
return None # The finally block is run before the method returns
finally:
other_code()
Compare to this:
try:
run_code1()
except TypeError:
run_code2()
return None
other_code() # This doesn't get run if there's an exception.
Other situations that can cause differences:
- If an exception is thrown inside the except block.
- If an exception is thrown in
run_code1()but it's not aTypeError. - Other control flow statements such as
continueandbreakstatements.
You can use finally to make sure files or resources are closed or released regardless of whether an exception occurs, even if you don't catch the exception. (Or if you don't catch that specific exception.)
myfile = open("test.txt", "w")
try:
myfile.write("the Answer is: ")
myfile.write(42) # raises TypeError, which will be propagated to caller
finally:
myfile.close() # will be executed before TypeError is propagated
In this example you'd be better off using the with statement, but this kind of structure can be used for other kinds of resources.
A few years later, I wrote a blog post about an abuse of finally that readers may find amusing.