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)