栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从异常对象中提取回溯信息

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从异常对象中提取回溯信息

这个问题的答案取决于您使用的Python版本。

在Python 3中

很简单:异常带有一个

__traceback__
包含回溯的属性。此属性也是可写的,并且可以使用
with_traceback
异常方法方便地设置:

raise Exception("foo occurred").with_traceback(tracebackobj)

这些功能在

raise
文档中作了最少描述。

答案的这一部分应归功于Vyctor,后者首先发布了此信息。我之所以将其包含在此处,仅是因为此答案停留在顶部,并且Python
3变得越来越普遍。

在Python 2中

这很烦人。回溯的麻烦在于它们具有对堆栈框架的引用,而堆栈框架具有对回溯的引用,而回溯具有对具有引用的…的堆栈框架的引用。这给垃圾收集器带来了问题。)

解决此问题的一种好方法是在离开该子句后以手术方式中断循环

except
,这就是Python 3所做的。Python
2解决方案更加丑陋:为您提供了一个即席函数
sys.exc_info()
,该函数
仅在
except
子句中有效 。它返回一个元组,其中包含异常,异常类型以及当前正在处理的任何异常的回溯。

因此,如果您在

except
子句中,则可以将的输出
sys.exc_info()
traceback
模块一起使用来做各种有用的事情:

>>> import sys, traceback>>> def raise_exception():...     try:...         raise Exception...     except Exception:...         ex_type, ex, tb = sys.exc_info()...         traceback.print_tb(tb)...     finally:...         del tb... >>> raise_exception()  File "<stdin>", line 3, in raise_exception

但是,随着您的编辑表示,你正在试图获得该回溯 ,如果你的异常没有被处理的已打印,它之后 已经
被处理。这个问题要难得多。不幸的是,在没有异常被处理时

sys.exc_info
返回
(None, None,None)
。其他相关
sys
属性也无济于事。
sys.exc_traceback
不处理任何异常时不推荐使用且未定义;
sys.last_traceback
看起来很完美,但似乎仅在交互式会话中定义。

如果您可以控制引发异常的方式,则可以使用

inspect
和自定义异常来存储某些信息。但是我不完全确定那将如何工作。

实话实说,捕获并返回异常是一件不寻常的事情。这可能表明您仍然需要进行重构。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/638816.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号