I am not sure why we need finally in try...except...finally statements. In my opinion, this code block
finally
try...except...finally
try: run_code1() except
In your first example, what happens if run_code1() raises an exception that is not TypeError? ... other_code() will not be executed.
run_code1()
TypeError
other_code()
Compare that with the finally: version: other_code() is guaranteed to be executed regardless of any exception being raised.
finally: