如何检索导致异常的代码行(而不是行号)?
这是一次尝试。
import sys, inspect
try:
1 / 0
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
code = str(inspect.getsourcelines(exc_tb.tb_frame.f_code))
print(code)
字符串
它返回脚本的第一行,而不是导致异常的行。
(['import sys, inspect\n'], 1)
型
2条答案
按热度按时间r1zk6ea11#
下面的代码工作,但它是不灵活的。别人可能有更好的解决方案。
字符串
sqxo8psd2#
为了补充spinx的答案,每个
FrameInfo
对象中都有属性因此,我们可以通过使用它们来使代码更具可读性:
字符串
我也不太高兴在
0
的随机索引的框架。阅读的描述inspect.info
,它听起来不像正确的位置被索引。inspect.trace(context=1)
返回当前帧和当前处理异常的帧之间的堆栈的FrameInfo
对象列表。列表中的第一个条目表示调用者;最后一个条目表示异常的引发位置。0
将给予调用者的行,而不是抛出者的行。一个很好的例子是here。(为了方便使用,我在这里复制它。)型
输出如下:
型
我们可以清楚地看到,在
0
处的索引为我们提供了在inspecter
中调用函数errorer
的行,而-1
为我们提供了抛出异常的点。因此,如果我们想知道哪一行抛出异常,
-1
是正确的,但是如果我们想知道失败函数/对象的调用树的根,0
是正确的。