sys.exc_info() 的用途是什么?

And*_*Sun 7 python cpython exception

我想了解以下之间的区别:

try:
    raise Exception("wat")
except Exception:
    extype, exc, tb = sys.exc_info()
    traceback.print_exception(extype, exc, tb)
Run Code Online (Sandbox Code Playgroud)

和:

try:
    raise Exception("wat")
except Exception as exc:
    extype = type(exc)
    tb = exc.__traceback__
    traceback.print_exception(extype, exc, tb)
Run Code Online (Sandbox Code Playgroud)

是否存在type(exc)exc.__traceback__与 返回的值不同的情况sys.exc_info()?如果不是,我什么时候应该选择其中一种而不是另一种?当我对此进行测试时(Python 3.7),返回的对象在引用上是相同的。

查看 CPython 中的实现exc_info(),第一个返回值(异常类型)似乎是通过调用PyExceptionInstance_Class获得的,这与type(exc). 但是,我无法找到如何设置回溯。

(FWIW我知道速记traceback.print_exc(),这与这个问题无关)

blh*_*ing 4

__traceback__属性仅从 Python 3.0 起可用,因此如果您希望使代码与 Python 2 兼容,则应该使用sys.exc_info();否则,根据PEP-3134,该__traceback__属性的引入确实意味着完全替换sys.exc_info(),并可能弃用它:

在今天的 Python 实现中,异常由三部分组成:类型、值和回溯。该模块在三个并行变量、 、 和sys中公开当前异常,该函数返回这三个部分的元组,并且 raise 语句具有接受这三个部分的三参数形式。操作异常通常需要并行传递这三件事,这可能很乏味且容易出错。此外, except 语句只能提供对值的访问,而不能提供回溯。将属性添加到异常值使得可以从一个位置访问所有异常信息。exc_typeexc_valueexc_tracebacksys.exc_info()__traceback__