如何提取函数直接引发异常的跟踪堆栈?

时间:2019-02-08 10:03:49

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

由于某种原因,堆栈中没有这样的框架。

例如,如果我在foo.py中有一个简单的函数:

def foo(a):
    if a < 0:
        raise Exception('a must be > 0.')

然后执行(从另一个文件detect.py):

try:
    foo(-1)
except Exception as e:
    error = traceback.extract_stack()
    print(error)

结果:[<FrameSummary file detect.py, line 16 in <module>>]

然后,我们看到当前文件中唯一发生异常的FrameSummary,没有关于引发异常(在foo.py中)的直接位置(行内容和line_no)的FrameSummary。

有没有提取信息的方法?

1 个答案:

答案 0 :(得分:0)

操作方法。我找到了一个解决方案(感谢检查模块及其工作人员):

import sys
import traceback
import inspect
from foo import foo

try:
    foo(-1)
except Exception as e:
    inner_frames = inspect.getinnerframes(e.__traceback__)
    print('File names: {}.'.format([x.filename for x in inner_frames]))
    print('Called in functions: {}.'.format([x.function for x in inner_frames]))
    print('Line numbers: {}.'.format([x.lineno for x in inner_frames]))

...

File names: ['detect.py', '/home/sergzach/Dropbox/tests/exception_detect_module/foo.py'].
Called in functions: ['<module>', 'foo'].
Line numbers: [12, 4].