Ответ 1
try:
#stuff
except Exception as e:
print e
Модуль traceback
предоставляет различные функции для извлечения дополнительной информации из объекта исключения (e
, выше).
Источник Ошибки и исключения
У меня есть программа, часть которой выполняет цикл. Во время выполнения этого цикла есть исключения. Очевидно, что я хотел бы, чтобы моя программа работала без ошибок, но для прогресса я хотел бы, чтобы программа выполнялась на протяжении всего ввода и не останавливалась, когда генерируется исключение. Самый простой способ сделать это - реализовать блок except
.
Однако, когда я это делаю, он except
все исключения и продолжает с программой, и я никогда не увижу сообщение об исключении, которое мне нужно для отладки.
Есть ли способ except
произвольного исключения и иметь возможность распечатывать сообщение об исключении в блоке except
?
try:
#stuff
except Exception as e:
print e
Модуль traceback
предоставляет различные функции для извлечения дополнительной информации из объекта исключения (e
, выше).
Источник Ошибки и исключения
Рассмотрите возможность использования модуля протоколирования Python, это даст вам много возможностей для регистрации проблем для последующей проверки. Ниже приведен простой пример использования модуля журнала для журнальных исключений:
import logging
LOG_FILE = '/tmp/exceptions.log'
logging.basicConfig(filename=LOG_FILE,level=logging.ERROR)
while True:
try:
# Code that may throw exceptions
except Exception, e:
logging.exception("An exception happened")
Используя функцию logging.exception
в обработчике исключений, как это делается здесь, информация об исключении автоматически добавляется в сообщение регистрации.
В то время как ответ Джеймса почти всегда то, что вы на самом деле хотите, это не совсем то, о чем попросил OP:
Есть ли способ исключить любое произвольное исключение и иметь возможность распечатать сообщение об исключении в блоке исключения?
Exception
фактически не обрабатывает все исключения, просто все исключения, которые вы обычно хотите поймать. В частности, в 2.5 и более поздних версиях:
Все встроенные исключения, не относящиеся к системе, выведены из этого класса. Все пользовательские исключения также должны быть получены из этого класса.
Это оставляет некоторые вещи:
KeyboardInterrupt
от пользователя, нажимающего ^C
(только 2.5 и более поздние версии)Очень часто вы хотите обрабатывать такие вещи, как KeyboardInterrupt
, и в этом случае вы используете BaseException
вместо Exception
. (См. Иерархия исключений для списка исключений и не являются подклассами Exception
.) Итак:
try:
# stuff
except BaseException as e:
print e
И (обычно временно во время отладки) иногда вы действительно хотите обрабатывать абсолютно все. В 2.7, который включает исключения, определенные как классы старого стиля; в 2.5 и более ранних версиях, он также включает строки. Единственный способ справиться со всеми этими возможностями - использовать голый except
, а затем использовать sys.exc_info
(и, необязательно, rec raise
все, что вы сделали 't хотите обработать):
try:
# stuff
except:
type, value, traceback = sys.exc_info()
print value
В качестве примечания я использую синтаксис except
нового стиля (except Exception as e
) выше. Это работает в версии 2.6 и более поздних версий, включая 3.x. Синтаксис старого стиля (except Exception, e
) устарел в 2.6 и перестает работать в версии 3.0, но если вы хотите работать со старыми версиями 2.x, вам нужно его использовать.
while True:
try:
# Do your stuff
except Exception, e:
print "Something happened: %s" % e
Я считаю, что это гораздо более полезно для отладки:
from traceback import print_exc
try:
raise Exception("doh!")
except:
print_exc()