Некоторые другие ответы уже указали на модуль traceback .
Обратите внимание, что при использовании print_exc
в некоторых угловых случаях вы не получите того, чего ожидаете. В Python 2.x:
import traceback
try:
raise TypeError("Oups!")
except Exception, err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_exc()
... будет отображать трассировку последнего исключения :
Traceback (most recent call last):
File "e.py", line 7, in
raise TypeError("Again !?!")
TypeError: Again !?!
Если вам действительно нужно получить доступ к исходному traceback . Одним из решений является кэширование информации об исключении , возвращенной из exc_info
, в локальную переменную и отображение ее с помощью print_exception
:
import traceback
import sys
try:
raise TypeError("Oups!")
except Exception, err:
try:
exc_info = sys.exc_info()
# do you usefull stuff here
# (potentially raising an exception)
try:
raise TypeError("Again !?!")
except:
pass
# end of useful stuff
finally:
# Display the *original* exception
traceback.print_exception(*exc_info)
del exc_info
Производство:
Traceback (most recent call last):
File "t.py", line 6, in
raise TypeError("Oups!")
TypeError: Oups!
Несколько ловушек с этим, хотя:
Из документа sys_info
:
Присвоение возвращаемого значения traceback локальной переменной в функции, которая обрабатывает исключение, вызовет циклическую ссылку . Это предотвратит сбор мусора, на который ссылается локальная переменная в той же функции или трассировка. [...] Если вам нужна трассировка, обязательно удалите ее после использования (лучше всего делать с помощью оператора try ... finally)
, но из того же документа:
Начиная с Python 2.2, такие циклы автоматически восстанавливаются , когда сборка мусора включена и становится недоступной, но она остается более эффективной для избегайте создания циклов.
С другой стороны, предоставляя вам доступ к трассировке , связанной с исключением, Python 3 дает менее удивительный результат:
import traceback
try:
raise TypeError("Oups!")
except Exception as err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_tb(err.__traceback__)
... будет отображаться:
File "e3.py", line 4, in
raise TypeError("Oups!")
Это в три или четыре раза более длинно, чем любая установка Ubuntu или обновление, которое я когда-либо испытывал, и я сделал что-то как 40 или 50 из них.
Ваш Интернет, возможно, понижался? Проверьте свой маршрутизатор. Вы действительно создавали резервную копию всех своих пользовательских файлов перед запуском, правильно? Поскольку это - то, почему Вы никогда не доверяете никакому обновлению или устанавливаете процедуру, это, как предполагается, оставляет Ваши данные нетронутыми. Это все еще, вероятно, там, живое и здорово, но если необходимо запустить, можно закончить тем, что делали установку от DVD или живого USB.
при окончании выполнения переустанавливания необходимо все еще быть в состоянии скопировать пользовательские данные прочь в Карту памяти путем начальной загрузки от диска установки или DVD и выбора "Try out Ubuntu without installing".