【问题标题】:Why is the traceback not stored in the exception object in Python 2?为什么回溯没有存储在 Python 2 的异常对象中?
【发布时间】:2016-01-19 18:08:37
【问题描述】:

据我了解,在 Python 2 中,如果我处理异常,将其捕获为对象,并希望将回溯作为字符串做一些事情:

try:
    ...
except Exception as e:
    tb = get_traceback(e)
    store_in_database(tb)

没有将e 作为参数的get_traceback 函数。有import traceback; traceback.format_exc(),但这并没有将e 作为参数。这似乎暗示此信息根本没有存储在 e 中。

但在 Python > 3.2 中,异常对象将有一个 __traceback__ 属性来存储回溯。

我有兴趣知道:

  • 在较低级别,此信息存储在哪里? (我知道这可能是一个实现细节)。

  • 为什么直到 Python 3 才存储在 e 中?

【问题讨论】:

标签: python-2.7 python-3.x exception-handling


【解决方案1】:

在较低级别,这些信息存储在哪里? (我知道这可能是一个实现细节)。

它是sys.exc_info()[2]。这不是实现细节。

如果您想要实现细节,sys.exc_info()Python/sysmodule.c 中实现,它从线程的PyThreadStateexc_traceback 成员中检索回溯。

为什么在 Python 3 之前它没有存储在 e 中?

历史原因。 Python 过去根本没有异常对象;旧方法使用字符串对象作为例外。那是一个非常糟糕的系统。当他们引入异常对象时,他们并没有立即将所有信息从sys.exc_info 移动到异常对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2010-11-23
    • 2010-12-08
    • 2012-07-10
    • 1970-01-01
    • 2021-12-26
    • 2021-08-08
    相关资源
    最近更新 更多