Как сохранить traceback / sys.информация по монтажу() значений переменной?


Я хочу сохранить имя ошибки и данные трассировки в переменную. Вот моя попытка.

import sys
try:
    try:
        print x
    except Exception, ex:
        raise NameError
except Exception, er:
    print "0", sys.exc_info()[0]
    print "1", sys.exc_info()[1]
    print "2", sys.exc_info()[2]

выход:

0 <type 'exceptions.NameError'>
1 
2 <traceback object at 0xbd5fc8>

Желаемый Результат:

0 NameError
1
2 Traceback (most recent call last):
  File "exception.py", line 6, in <module>
    raise NameError

P. S. Я знаю, что это может быть легко сделано с помощью модуля трассировки, но я хочу знать использовать представление sys.exc_info()[2] объект здесь.

4 77

4 ответа:

вот как я это делаю:

>>> import traceback
>>> try:
...   int('k')
... except:
...   var = traceback.format_exc()
... 
>>> print var
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: invalid literal for int() with base 10: 'k'

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

sys.exc_info () возвращает кортеж с тремя значениями (type, value, traceback).

  1. здесь тип получает тип исключения обрабатываемого исключения
  2. значение-это аргументы, которые передаются в конструктор класса exception
  3. трассировка содержит информацию о стеке, например, где произошло исключение и т. д.

например, в следующей программе

try:

    a = 1/0

except Exception,e:

    exc_tuple = sys.exc_info()

теперь, если мы печатаем кортеж значения будут такими.

  1. exc_tuple[0] значение "ZeroDivisionError"
  2. exc_tuple[1] значение "целочисленное деление или по модулю от нуля" (строка, переданная в качестве параметра класса exception)
  3. exc_tuple[2] Значение "объект trackback at (некоторый адрес памяти)"

вышеуказанные сведения также можно получить, просто распечатав исключение в строковом формате.

print str(e)

использовать traceback.extract_stack() Если вам нужен удобный доступ к именам модулей и функций и номерам строк.

использовать ''.join(traceback.format_stack()) Если вы просто хотите, чтобы строка, которая выглядит как traceback.print_stack() выход.

обратите внимание, что даже с ''.join() вы получите многострочную строку, так как элементы format_stack() содержат \n. См. вывод ниже.

не забудьте import traceback.

вот вывод из traceback.extract_stack(). Добавлено форматирование для удобочитаемость.

>>> traceback.extract_stack()
[
   ('<string>', 1, '<module>', None),
   ('C:\Python\lib\idlelib\run.py', 126, 'main', 'ret = method(*args, **kwargs)'),
   ('C:\Python\lib\idlelib\run.py', 353, 'runcode', 'exec(code, self.locals)'),
   ('<pyshell#1>', 1, '<module>', None)
]

вот вывод из ''.join(traceback.format_stack()). Форматирование добавлено для удобства чтения.

>>> ''.join(traceback.format_stack())
'  File "<string>", line 1, in <module>\n
   File "C:\Python\lib\idlelib\run.py", line 126, in main\n
       ret = method(*args, **kwargs)\n
   File "C:\Python\lib\idlelib\run.py", line 353, in runcode\n
       exec(code, self.locals)\n  File "<pyshell#2>", line 1, in <module>\n'

мой ответ к другому вопросу может помочь проиллюстрировать детали-со ссылками! Для консервированных строк стандартный модуль трассировки библиотеки кажется нормальным. Если вы хотите получить подробную информацию, прочитайте источник (<python install path>/Lib/traceback.py) для получения дополнительной информации.