首页 > 解决方案 > Python版本之间的变量范围差异

问题描述

考虑以下代码:

import shutil
import time
t = time.time()
exception = None
while time.time() < (t + 10.0):
    try:
        shutil.rmtree('/path-to-non-existent-directory')
        break
    except OSError as exception:
        pass
    time.sleep(0.1)
else:
    if exception:
        raise exception

在 Python 2.7 中,此代码完全有效,但在 Python 3.7 中,我收到以下警告:

Local variable exception might be referenced before assignment

else条款中。

有谁知道在 Python 3.7 中运行此代码段有什么问题?

标签: python

解决方案


在 Python 3 中,为了解决由于引入__traceback__属性而导致的循环引用问题,在块except的末尾会自动删除一个目标except。它的行为就像你写的一样

except OSError as exception:
    pass
    del exception

这记录在PEP 3110中。

如果要保留异常对象,应将其保存到第二个变量:

except OSError as exception:
    saved_exception = exception

exception仍将被删除,但您可以在块结束saved_exception后使用检查异常对象。except


推荐阅读