Я хочу сохранить имя ошибки и детали трассировки в переменной. Вот моя попытка.
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
PS Я знаю, что это легко сделать с помощью модуля трассировки, но я хочу узнать об использовании здесь объекта sys.exc_info () [2].
python
exception-handling
codersofthedark
источник
источник
<python install path>/Lib/traceback.py
) для получения дополнительной информации.Ответы:
Вот как я это делаю:
Однако вам следует взглянуть на документацию по трассировке , так как вы можете найти там более подходящие методы, в зависимости от того, как вы хотите впоследствии обрабатывать свою переменную ...
источник
sys.exc_info()[2].tb_frame.f_code.co_names[3]
, но в этом нет никакого смысла ... Еслиtraceback
в стандартной библиотеке есть вызываемый модуль , то для этого есть причина ... :)traceback.format_exception(*sys.exc_info())
- способ сделать это. Но это функционально эквивалентноtraceback.format_exc()
.sys.exc_info () возвращает кортеж с тремя значениями (тип, значение, трассировка).
Например, в следующей программе
Теперь, если мы напечатаем кортеж, значения будут такими.
Вышеуказанные данные также можно получить, просто распечатав исключение в строковом формате.
источник
Используйте,
traceback.extract_stack()
если вам нужен удобный доступ к названиям модулей и функций и номерам строк.Используйте,
''.join(traceback.format_stack())
если вам просто нужна строка, которая выглядит какtraceback.print_stack()
результат.Обратите внимание, что даже с помощью
''.join()
вы получите многострочную строку, поскольку элементы изformat_stack()
файла contain\n
. См. Вывод ниже.Запомни
import traceback
.Вот результат
traceback.extract_stack()
. Форматирование добавлено для удобства чтения.Вот результат
''.join(traceback.format_stack())
. Форматирование добавлено для удобства чтения.источник
Будьте осторожны при извлечении объекта исключения или объекта трассировки из обработчика исключений, поскольку это вызывает циклические ссылки и
gc.collect()
не удастся собрать. Это, по-видимому, является особой проблемой в среде записной книжки ipython / jupyter, где объект трассировки не очищается в нужный момент, и даже явный вызовgc.collect()
infinally
section ничего не делает. И это огромная проблема, если у вас есть огромные объекты, память которых не восстанавливается из-за этого (например, исключения из памяти CUDA, которые без этого решения требуют полного перезапуска ядра для восстановления).В общем, если вы хотите сохранить объект трассировки, вам необходимо очистить его от ссылок на
locals()
, например:В случае ноутбука jupyter вы должны сделать это, по крайней мере, внутри обработчика исключений:
Протестировано на Python 3.7.
ps проблема с ipython или jupyter notebook env заключается в том, что у него есть
%tb
магия, которая сохраняет трассировку и делает ее доступной в любой момент позже. И в результате любыеlocals()
кадры, участвующие в трассировке, не будут освобождены до тех пор, пока записная книжка не выйдет из записной книжки или другое исключение не перезапишет ранее сохраненную трассировку. Это очень проблематично. Он не должен сохранять трассировку без очистки своих фреймов. Исправление представлено здесь .источник
Объект можно использовать как параметр в
Exception.with_traceback()
функции:источник