Как извлечь стек трассировки, где функция напрямую вызывает исключение? - PullRequest
0 голосов
/ 08 февраля 2019

По какой-то причине в стеке нет такого фрейма.

Например, если у меня есть простая функция в foo.py:

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

и do (из другого файлаdetect.py):

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

Результат: [<FrameSummary file detect.py, line 16 in <module>>]

Затем мы видим единственный FrameSummary из текущего файла, где происходит исключение, нет FrameSummary о прямом месте (содержимое строки иline_no) где возникла исключительная ситуация (в foo.py).

Есть ли способ извлечь информацию?

1 Ответ

0 голосов
/ 08 февраля 2019

Как это сделать.Я нашел решение (спасибо осмотреть модуль и ребята, которые работали над ним):

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].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...