了解命名異常的NameError 和UnboundLocalError 問題
在Python 2.x 中,下面的片段片段正確地列印了命名的片段值異常,exc,在except 區塊之外:
<code class="python">exc = None try: raise Exception except Exception as exc: pass print(exc)</code>
但是,在Python 3.x 中,嘗試相同的程式碼會產生NameError(或函數上下文中的UnboundLocalError)。要解決這個問題,必須掌握 Python 更新行為背後的基本原則。
Python 3.x 異常範圍與清理
Python 3.x 中的except 語句明確限制綁定異常的範圍,以防止循環引用和過早的垃圾收集。當使用 as 語法分配異常時,它會在 except 子句的末尾被清除。這需要將異常分配給 except 區塊之外的不同名稱,以便進一步存取。
簡單地重新指派 exc = exc 是不夠的,因為 except 子句不會建立新的作用域。相反,它會從當前異常分配中刪除異常分配中指定的名稱。
歷史上下文和Python 2.x 行為
在Python 2.x 中,異常確實不擁有對回溯的引用,從而消除了像Python 3.x中那樣嚴格的清理的需要。由於沒有循環引用,異常可以綁定到 except 區塊之外的命名變量,而不會造成問題。
處理異常的建議
在Python 3 中有效處理異常.x,建議遵循以下準則:
以下程式碼舉例說明了這些建議:
<code class="python">try: raise Exception("foo") except Exception as e: exc = e # Bind to a new variable exc.__traceback__ = None # Explicitly clear traceback</code>
透過遵循這些實踐,您可以自信地處理和存取Python 3.x 中的異常,避免陷阱由NameError 和UnboundLocalError 構成。
以上是為什麼在 Python 3.x 中處理異常時會出現 NameError 或 UnboundLocalError?的詳細內容。更多資訊請關注PHP中文網其他相關文章!