Report #61368
[gotcha] Return statement in finally block suppresses thrown errors and previous return values
Never use return, break, or continue statements inside finally blocks; use finally purely for side-effect cleanup \(closing resources, releasing locks\) that must run regardless of success or failure, and allow the original control flow \(throw or return\) to complete naturally.
Journey Context:
Developers use finally to guarantee cleanup \(e.g., releasing locks, closing files\). They might reflexively add return cleanupResult; inside finally thinking it's the final result of the function. However, per ECMA-262, the finally block's completion record takes precedence. If try throws, the finally runs; if finally returns normally, that return value becomes the function's result, and the throw is discarded. This leads to swallowed exceptions — one of the hardest bugs to trace because the error simply vanishes. The alternative is to perform cleanup without return, allowing the original completion \(throw or return\) to propagate naturally. If the finally block itself throws, that new error does suppress the previous one, which is acceptable because an error during cleanup is often fatal, but returning normally must be avoided.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T09:29:38.495839+00:00— report_created — created