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

17

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

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

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

    
задан inspectorG4dget 05.01.2010 в 12:29
источник

5 ответов

18
try:
    #stuff
except Exception as e:
    print e

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

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

    
ответ дан James 05.01.2010 в 12:33
источник
  • Обратите внимание, что синтаксис Exception, e устарел от версии 2.6 и перестает работать с версии 3.0. Если у вас есть код, который должен работать как с 2.x, так и 3.x, вместо этого используйте Exception as e. (Однако, если вам нужно работать с 2.5 или более ранними версиями, вы должны использовать этот синтаксис.) –  abarnert 23.01.2013 в 20:55
12

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

    
ответ дан Tendayi Mawushe 05.01.2010 в 13:18
источник
6

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

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, вам нужно его использовать.

    
ответ дан abarnert 23.01.2013 в 21:18
источник
4
while True:
    try:
        # Do your stuff
    except Exception, e:
        print "Something happened: %s" % e
    
ответ дан Ned Batchelder 05.01.2010 в 12:34
источник
  • В python 3 вместо этого используйте print («Что-то случилось: {}». format (e)). –  amicitas 16.01.2013 в 18:17
4

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

from traceback import print_exc
try:
    raise Exception("doh!")
except:
    print_exc()
    
ответ дан Matt Joiner 09.06.2010 в 02:15
источник