Как сохранить 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 ответа:
вот как я это делаю:
>>> 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).
- здесь тип получает тип исключения обрабатываемого исключения
- значение-это аргументы, которые передаются в конструктор класса exception
- трассировка содержит информацию о стеке, например, где произошло исключение и т. д.
например, в следующей программе
try: a = 1/0 except Exception,e: exc_tuple = sys.exc_info()
теперь, если мы печатаем кортеж значения будут такими.
- exc_tuple[0] значение "ZeroDivisionError"
- exc_tuple[1] значение "целочисленное деление или по модулю от нуля" (строка, переданная в качестве параметра класса exception)
- 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
) для получения дополнительной информации.