繁体   English   中英

使用 python 回溯类型

[英]using the python traceback type

通过在处理异常时调用sys.exc_info()返回一个 3 元组,其中包含异常类、异常对象和回溯。

sys.exc_info的文档也证明了这一点:

此函数返回一个包含三个值的元组,这些值提供有关当前正在处理的异常的信息。 ...返回的值是(type, value, traceback) ... traceback获取一个 traceback 对象(参见参考手册),它封装了最初发生异常的点的调用堆栈。

我想使用用于在上述exc_info返回值中创建第三个变量的类型回溯,但找不到它的定义位置。

因此,我的问题是,可用于 python 脚本的traceback类型在哪里?

编辑:

我想使用traceback类型来定义 PyQt信号 PyQt 信号是通过指定信号名称和传递的参数类型来定义的。 并不需要创建一个类型的对象,只有在类似的方式使用它isinstance调用。

坏消息,即使您可以像这样获得回溯对象的类:

import sys

try:
    raise Exception
except:
    tb = sys.exc_info()[2]

print(tb.__class__)

结果:

<class 'traceback'>

当你尝试:

tb.__class__()

你得到:

TypeError: cannot create 'traceback' instances

所以回溯类型不能在外部实例化,可能是因为你需要访问 python 内部来这样做(并且属性是只读的,即使是tb_lineno所以也不可能“重用”一个实例)

您可以使用traceback.format_exc()sys.exc_info()像:

try:
    raise TypeError("Error !?!")
except Exception:
    print(traceback.format_exc())
    # or
    print(sys.exc_info()[2])

我看到标签包含python2.7 ,问题很旧,所以很抱歉再次提出这个问题,但只想说在现代 Python 中,TracebackType 现在位于types模块中:

>>> isinstance(sys.exc_info()[2], types.TracebackType))
True

虽然看起来类本身认为它有一个不同的名字:

>>> repr(sys.exc_info()[2].__class__)
<class 'traceback'>

真正有趣的是,虽然不是问题的主题,但对其中一个答案的解释是,现在可以(自 Python 3.7 起)手动构建回溯。 这对于在异常中准确反映报告的回溯具有有趣的意义,并且与延迟/延迟/异步异常特别相关。 更改本身来自https://github.com/python/cpython/pull/4793 - 尽管如此,我还没有看到任何好的文档/示例。 请随时对此类文章(或其他真正关心此问题的 StackOverflow 问题)发表评论。

这应该在 C 代码中定义:

包含/traceback.h

#ifndef Py_LIMITED_API
typedef struct _traceback {
    PyObject_HEAD
    struct _traceback *tb_next;
    struct _frame *tb_frame;
    int tb_lasti;
    int tb_lineno;
} PyTracebackObject;
#endif

嗯..事实上,我不太确定你想做什么,所以不能帮助更多..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM