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

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

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

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

Ответы [ 5 ]

19 голосов
/ 05 января 2010
try:
    #stuff
except Exception as e:
    print e

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

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

12 голосов
/ 05 января 2010

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

6 голосов
/ 24 января 2013

Хотя ответ Джеймса почти всегда то, что вы на самом деле хотите, это не совсем то, о чем просил ОП:

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

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

4 голосов
/ 09 июня 2010

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

from traceback import print_exc
try:
    raise Exception("doh!")
except:
    print_exc()
4 голосов
/ 05 января 2010
while True:
    try:
        # Do your stuff
    except Exception, e:
        print "Something happened: %s" % e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...