使用 Python 回溯类型



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

这在sys.exc_info的文档中也很明显:

此函数返回一个包含三个值的元组,这些值提供有关当前正在处理的异常的信息。返回的值(type, value, traceback)。...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 代码中定义:

包含/回溯.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

嗯..其实我不太确定你想做什么,所以帮不上更多忙。

相关内容

最新更新