Why does the function not raise the exception? It's apparently not caught.
def f():
try:
raise Exception
finally:
return "ok"
print(f()) # ok
Why does the function not raise the exception? It's apparently not caught.
def f():
try:
raise Exception
finally:
return "ok"
print(f()) # ok
This is explicitly explained in the documentation:
If an exception occurs in any of the clauses and is not handled, the exception is temporarily saved. The
finally
clause is executed. [..] If thefinally
clause executes areturn
orbreak
statement, the saved exception is discarded
From the docs:
A finally clause is always executed before leaving the try statement.
@deceze quoted the more relevant part in his answer
The function returns the string in the finally
clause and doesn't raise the exception since it returned, and that what gets printed.
If you try to execute:
>>> try:
... raise Exception
... finally:
... print('yes')
...
yes
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception
Then as you can see, "yes" is printed and the exception is thrown after the print statement.
From the documentation:
A finally clause is always executed before leaving the try statement, whether an exception has occurred or not. [...] The finally clause is also executed “on the way out” when any other clause of the try statement is left via a break, continue or return statement.
That mean, in a function the finally clause will always be the one that returns. Even if no exception as occurred:
def f():
try:
return 'OK'
finally:
return 'Finally'
f() # returns 'Finally'
The documentation says:
A finally clause is always executed before leaving the
try
statement, whether an exception has occurred or not. When an exception has occurred in thetry
clause and has not been handled by anexcept
clause (or it has occurred in aexcept
orelse
clause), it is re-raised after thefinally
clause has been executed.
In your case, the exception has not been handled, so should be re-raised after the finally
clause, but since you return from the finally
clause, the exception is never re-raised.