I am not sure why we need finally in try...except...finally statements. In my opinion, this code block
try:
    run_code1()
except TypeError:
    run_code2()
other_code()
is the same with this one using finally:
try:
    run_code1()
except TypeError:
    run_code2()
finally:
    other_code()
Am I missing something?
Advertisement
Answer
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.