Функция отслеживания исключений Python сообщает мне, где заканчивается строка и где она начинается? - PullRequest
1 голос
/ 15 ноября 2008

Когда исключение Python генерируется кодом, который занимает несколько строк, например ::100100

   myfoos = [foo("bar",
                "baz",
                "quux",
                 i) for i in range(10)]

Python сообщит номер строки последней строки и покажет фрагмент кода из этой строки:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    i) for i in range(10)]
NameError: name 'foo' is not defined

Есть ли способ определить, что такое первая строка? Есть ли способ перехватить исключение и манипулировать объектом traceback , чтобы иметь возможность сообщить что-то вроде этого:

Traceback (most recent call last):
 File "test.py", lines 1-4 in <module>
   myfoos = [foo("bar",
                "baz",
                "quux",
                 i) for i in range(10)]
 NameError: name 'foo' is not defined

Ответы [ 2 ]

2 голосов
/ 15 ноября 2008

Найти начало строки будет действительно сложно. Вам придется либо проанализировать Python, либо, возможно, покопаться в скомпилированном байт-коде. В стандартной библиотеке есть модули для разбора Python, но я могу сказать по своему опыту, что интерпретация их вывода - это черное искусство. И я не уверен, что у скомпилированного байтового кода тоже есть ответ ...

0 голосов
/ 15 ноября 2008

В блоке try / исключением вы можете исключить NameError и попробовать установить NameError.lineno, хотя я не совсем уверен, работает ли это или как, но это лучшее, что я нашел при этом.

try:
    somecode
except NameError
    NameError.lineno = [1,4]

Вам нужно как-то выяснить, где начинается и заканчивается оператор, а также, какой оператор вызывает ошибку.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...