我一直在阅读标准线程库(Python 2.6)中的一些代码,并且有一段代码让我感到奇怪。它可以缩短到以下结构(与 threading.py 中的__bootstrap_inner方法相比):
def foo():
exc_type, exc_value, exc_tb = sys.exc_info()
try:
# some code
except:
# some code
finally:
del exc_type, exc_value, exc_tb
这些变量不在foo
范围之外。有没有理由在最后删除这些引用?
答案 0 :(得分:8)
是的,至少是exc_tb
; traceback对象保存对当前帧的引用,这使得它成为循环引用。
通过删除本地引用,您可以打破该圈子,因此您不必希望并相信垃圾收集器能够。
来自sys.exc_info()
function docs:
警告:将回溯返回值分配给处理异常的函数中的局部变量将导致循环引用。这将阻止同一函数中的局部变量或回溯引用的任何内容被垃圾回收。由于大多数函数不需要访问回溯,因此最好的解决方案是使用
exctype, value = sys.exc_info()[:2]
之类的东西来仅提取异常类型和值。如果确实需要回溯,请确保在使用后删除它(最好使用try
...finally
语句)或在本身不处理的函数中调用exc_info()
例外。