Подтвердить что ты не робот

Обработка произвольного исключения, печать сообщения об исключении по умолчанию

У меня есть программа, часть которой выполняет цикл. Во время выполнения этого цикла есть исключения. Очевидно, что я хотел бы, чтобы моя программа работала без ошибок, но для прогресса я хотел бы, чтобы программа выполнялась на протяжении всего ввода и не останавливалась, когда генерируется исключение. Самый простой способ сделать это - реализовать блок except.

Однако, когда я это делаю, он except все исключения и продолжает с программой, и я никогда не увижу сообщение об исключении, которое мне нужно для отладки.

Есть ли способ except произвольного исключения и иметь возможность распечатывать сообщение об исключении в блоке except?

4b9b3361

Ответ 1

try:
    #stuff
except Exception as e:
    print e

Модуль traceback предоставляет различные функции для извлечения дополнительной информации из объекта исключения (e, выше).

Источник Ошибки и исключения

Ответ 2

Рассмотрите возможность использования модуля протоколирования 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 в обработчике исключений, как это делается здесь, информация об исключении автоматически добавляется в сообщение регистрации.

Ответ 3

В то время как ответ Джеймса почти всегда то, что вы на самом деле хотите, это не совсем то, о чем попросил 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, вам нужно его использовать.

Ответ 4

while True:
    try:
        # Do your stuff
    except Exception, e:
        print "Something happened: %s" % e

Ответ 5

Я считаю, что это гораздо более полезно для отладки:

from traceback import print_exc
try:
    raise Exception("doh!")
except:
    print_exc()