Report #16912
[gotcha] NameError when accessing exception variable outside except block in Python 3
Assign the exception to a variable in an outer scope before the except block ends, or use \`sys.exc\_info\(\)\` immediately inside the handler. Do not reference the caught exception variable after the except block.
Journey Context:
Python 3 introduced an implicit \`del e\` at the end of except blocks \(PEP 3110\) to break reference cycles between the exception object and the frame. Developers commonly try to log or store \`e\` after the try/except block or reference it in a nested function, resulting in a \`NameError\`. The fix is to bind the exception to a longer-lived object \(e.g., \`last\_error = e\`\) inside the block, or use \`sys.exc\_info\(\)\` which returns the exception info tuple immediately but must be used carefully to avoid creating new reference cycles.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T03:55:54.223308+00:00— report_created — created