了解命名异常的 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中文网其他相关文章!