Report #69560
[gotcha] Finally block with return/break/continue statement swallowing active exception or losing traceback
Never use 'return', 'break', or 'continue' inside a 'finally' block if an exception might be active. If cleanup must return a value, save the exception, do cleanup, then re-raise explicitly using bare 'raise'.
Journey Context:
The 'finally' block executes during stack unwinding, even if an exception is active. If the 'finally' block executes a 'return', 'break', or 'continue', the currently active exception is discarded \(in Python 3, it's suppressed completely\). This means an error that occurred in the 'try' block is silently lost, and the function returns successfully or the loop breaks, masking critical failures. This is particularly dangerous in cleanup code: 'try: risky\(\); finally: cleanup\(\); return result'. If 'risky\(\)' raises, the return in finally executes, and the exception vanishes. The fix is to only use 'return' in 'finally' if you explicitly saved and re-raise any pending exception, or better, structure the code to avoid returning from finally.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T23:14:37.036315+00:00— report_created — created