慕斯709654
有一个具体的例子说明您应该在什么时候使用del(也许还有其他人,但我知道这件事是随手发生的)当你使用的时候sys.exc_info()检查异常。此函数返回元组、引发的异常类型、消息和回溯。前两个值通常足以诊断错误并对其进行操作,但第三个值包含引发异常和捕获异常之间的整个调用堆栈。特别是,如果你做了这样的事情try:
do_evil()except:
exc_type, exc_value, tb = sys.exc_info()
if something(exc_value):
raise回溯,tb在调用堆栈的局部变量中结束,创建一个不能被垃圾收集的循环引用。因此,重要的是:try:
do_evil()except:
exc_type, exc_value, tb = sys.exc_info()
del tb if something(exc_value):
raise若要打破循环引用,请执行以下操作。在许多情况下,您会想要调用sys.exc_info(),就像元类魔法,回溯是很有用,所以您必须确保在可能离开异常处理程序之前清理它。如果您不需要追溯,您应该立即删除它,或者只执行以下操作:exc_type, exc_value = sys.exc_info()[:2]一起避免这一切。