fre*_*ish 6 python reference try-catch
我一直在阅读标准线程库(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
Run Code Online (Sandbox Code Playgroud)
这些变量不在foo
范围之外.有没有理由在最后删除这些引用?
是的,至少是exc_tb
; traceback对象包含对当前帧的引用,这使得它成为循环引用.
通过删除本地引用,您可以打破该圈,因此您不必希望并相信垃圾收集器能够.
警告:将回溯返回值分配给处理异常的函数中的局部变量将导致循环引用.这将阻止同一函数中的局部变量或回溯引用的任何内容被垃圾回收.由于大多数函数不需要访问回溯,因此最好的解决方案是使用类似的方法
exctype, value = sys.exc_info()[:2]
来仅提取异常类型和值.如果确实需要回溯,请确保在使用后删除它(最好使用try
...finally
语句)或调用exc_info()
本身不处理异常的函数.