- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在不同的代码库中看到过,只是在 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/
我创建了一个 django (1.6.1) 项目并使用了 mongodb。当我运行 python manage.py runserver 0.0.0.0:8000 启动服务器时,出现以下错误 Fi
我正在寻找一种方法来设置 logging.info、logging.warning、logging.error 等 默认情况下,exc_info=True。重构项目以包含此参数在这一点上是不可行的,因
在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。 捕获异常时,有 2 种方式可获得更多的异常信息,分别是: 使用 sys 模块中的 exc
我想了解以下之间的区别: try: raise Exception("wat") except Exception: extype, exc, tb = sys.exc_info()
在 Python 中,我有捕获异常的代码,如下所示: try: except: exc_info = sys.exc_info() 我遇到的问题是回溯对象 (exc_info[2])
sys.exc_info() 的行为在 python docs 中有描述。和 SO和 SO作为: 在 except block 或由 except block 调用的方法中,描述异常的三元组 在其他地
我为它定义根记录器和处理程序: _root = logging.getLogger() _sh = logging.StreamHandler() _fh = logging.FileHandler(
我正在尝试从异常对象 err 中获取更多信息,超出其错误消息。在我的代码中,我有时会在某些子函数深处捕获异常。回到顶层,我想打印有关异常发生位置等的信息。 我见过类似的问题,其中答案涉及使用 sys.
我知道 sys.exc_info文档说在处理回溯对象时要小心,但我仍然不确定某些情况下的安全性或不安全性。此外,文档说“警告:不要这样做!”,紧接着是“注意:实际上,没问题”,这让我更加困惑。 在任何
我在不同的代码库中看到过,只是在 PyMOTW 上阅读(请参阅第一个注释 here)。 解释说,如果将回溯分配给 sys.exc_info()[2] 中的变量,将创建一个循环,但这是为什么呢? 这个问
在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。 捕获异常时,有 2 种方式可获得更多的异常信息,分别是: 使用 sys 模块中的 exc_info
我应该选择 sys.exc_info()在 sys.last_value和 friend (sys.last_type,sys.last_traceback)? 最佳答案 查看sys.last_val
我想将错误名称和回溯详细信息保存到变量中。这是我的尝试。 import sys try: try: print x except Exception, ex:
我在 Django 中使用以下格式化程序来记录 django.request 模块中的警告和错误: 'format': '%(levelname)s: %(message)s\n %(exc_info
traceback.format_exception_only有参数 (etype, value)。如果我有一个要格式化的异常 e,在什么情况下我不想调用 format_exception_only(
我有一个捕获所有异常的函数,我希望能够在该函数中将回溯作为字符串获取。 到目前为止这还行不通: def handle_errors(error_type, error_message, error_t
我是一名优秀的程序员,十分优秀!