Python sys.exc_info()的用途是什么?
我想了解以下两者之间的区别:Python sys.exc_info()的用途是什么?,python,exception,cpython,Python,Exception,Cpython,我想了解以下两者之间的区别: try: raise Exception("wat") except Exception: extype, exc, tb = sys.exc_info() traceback.print_exception(extype, exc, tb) 以及: 是否存在type(exc)和exc.\uu回溯\uu与sys.exc\u info()返回的值不同的情况?如果不是,我应该在什么时候选择一个?当我测试这个(Python3.7)时,返回的对象在
try:
raise Exception("wat")
except Exception:
extype, exc, tb = sys.exc_info()
traceback.print_exception(extype, exc, tb)
以及:
是否存在type(exc)
和exc.\uu回溯\uu
与sys.exc\u info()返回的值不同的情况?如果不是,我应该在什么时候选择一个?当我测试这个(Python3.7)时,返回的对象在引用上是相同的
查看CPython中exc_info()
的实现,第一个返回值(异常类型)似乎是通过调用获得的,它与type(exc)
完全相同。但是,我无法找到如何设置回溯
(FWIW我知道traceback.print_exc()
速记,这与这个问题无关)自Python 3.0以来,\uu traceback\uu
属性才可用,因此如果您希望使代码与Python 2兼容,应该改用sys.exc_info()
;否则,根据,引入\uuuu traceback\uuuu
属性实际上是为了完全替换sys.exc\u info()
,并且可能会弃用它:
在今天的Python实现中,异常由三个部分组成
部分:类型、值和回溯。sys
模块显示
三个并行变量中的当前异常,exc_type
,
exc\u value
和exc\u traceback
,sys.exc\u info()
函数返回
这三部分的元组,并且raise语句具有
接受这三部分的三个论证形式。操纵
异常通常需要同时传递这三件事,
这可能是乏味和容易出错的。此外,除
语句只能提供对值的访问,而不能提供回溯。
将\uuuu traceback\uuuu
属性添加到异常值会使所有
可从单个位置访问的异常信息
sys.exc_info()
仅适用于当前异常,您可以对任何异常使用其他操作。@Barmar我明白,我想我的问题更多的是“既然我们可以直接从异常对象获得相同的值,为什么exc_info
存在?”啊,我明白了,所以exc_info
首先出现了,后来又添加了\uuuuuuuuuuuuuuuuuu
。我的印象是,\uu回溯一直存在。我仍然不确定他们为什么觉得需要返回异常对象的类型,但至少这解释了为什么我们有exc\u info
。谢谢
try:
raise Exception("wat")
except Exception as exc:
extype = type(exc)
tb = exc.__traceback__
traceback.print_exception(extype, exc, tb)