gpt4 book ai didi

python - 为什么需要显式删除 sys.exc_info() 回溯?

转载 作者:太空狗 更新时间:2023-10-29 17:38:24 25 4
gpt4 key购买 nike

我在不同的代码库中看到过,只是在 PyMOTW 上阅读(请参阅第一个注释 here)。

解释说,如果将回溯分配给 sys.exc_info()[2] 中的变量,将创建一个循环,但这是为什么呢?

这个问题有多大?我是否应该在我的代码库中搜索 exc_info 的所有用途并确保删除回溯?

最佳答案

Python 3(对原始答案的更新):

在 Python 3 中,问题中引用的建议已从 Python 文档中删除。我的原始答案(如下)仅适用于在其文档中包含引用的 Python 版本。

Python 2:

Python 垃圾收集器最终会找到并删除循环引用,例如通过从其中一个堆栈帧本身引用回溯堆栈而创建的循环引用,因此不要返回并重写您的代码。但是,展望 future ,您可以听从

http://docs.python.org/library/sys.html

(它记录了 exc_info())并说:

exctype, value = sys.exc_info()[:2]

当你需要抓取异常时。

另外两个想法:

首先,您为什么要运行 exc_info()

如果你想捕获一个异常,你不应该只说:

try:
...
except Exception as e: # or "Exception, e" in old Pythons
... do with with e ...

而不是在 sys 模块中处理对象?

其次:好吧,我给了很多建议,但还没有真正回答你的问题。 :-)

为什么会产生循环?好吧,在简单的情况下,当对象引用自身时会创建一个循环:

a = [1,2,3]
a.append(a)

或者当两个对象相互引用时:

a = [1,2,3]
b = [4,5,a]
a.append(b)

在这两种情况下,当函数结束时,变量值仍然存在,因为它们被锁定在引用计数的拥抱中:在另一个先消失之前,它们都不会消失!只有现代 Python 垃圾收集器可以通过最终注意到循环并打破它来解决这个问题。

因此理解这种情况的关键是“回溯”对象——exc_info() 返回的第三个东西(在索引 #2 处)——包含每个函数的“堆栈框架”在调用异常时处于事件状态。那些堆栈帧不是“死”对象,显示调用执行时为真的东西;框架还活着!捕获到异常的函数仍然存在,所以它的栈帧是一个有生命的东西,在它的代码执行处理异常时仍在增长和丢失变量引用(并且在它完成“except”子句并运行时做任何其他事情关于它的工作)。

因此,当您说 t = sys.exc_info()[2] 时,回溯中的那些堆栈帧之一 — 实际上,该帧属于当前正在运行的函数 —现在其中有一个名为 t 的变量,它指向栈帧本身,创建一个循环,就像我上面显示的那样。

关于python - 为什么需要显式删除 sys.exc_info() 回溯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com