通过在处理异常时调用sys.exc_info()
,返回包含异常类,异常对象和回溯的3元组。
sys.exc_info
的文档也证明了这一点:
此函数返回三个值的元组,这些值提供有关当前正在处理的异常的信息。 ...返回的值为
(type, value, traceback)
。 ... traceback 获取一个回溯对象(参见参考手册),该对象将调用堆栈封装在最初发生异常的位置。
我想使用 type traceback,它用于在前面提到的exc_info
返回值中创建第三个变量,但无法找到它定义的位置。
因此,我的问题是,traceback
类型在哪里可用于python脚本?
修改
我想使用traceback
类型来定义PyQt 信号。 PyQt信号通过指定信号名称和传递的参数类型来定义。我不需要创建该类型的对象,只能以类似于isinstance
调用的方式使用它。
答案 0 :(得分:3)
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
所以不可能重复使用&#34 34;一个实例)
答案 1 :(得分:1)
您可以使用traceback.format_exc()
或sys.exc_info()
之类的:
try:
raise TypeError("Error !?!")
except Exception:
print(traceback.format_exc())
# or
print(sys.exc_info()[2])
答案 2 :(得分:1)
我看到标签包含 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 问题)发表评论。
答案 3 :(得分:0)
应该在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
实际上,我不太确定你想做什么,所以无法帮助更多..