Общий улов для Python


86

У меня очень странное поведение, которое, кажется, приводит к тихим исключениям. Как я могу написать общую попытку, в которой я могу отлаживать все исключения. Что-то вроде:

try:
    # something that fails
except e:
    print e

Еще немного о проблеме в деталях:

У меня есть приложение Django, которое на моем компьютере (Ubuntu Linux 8.10) отлично работает как через runserver, так и через mod-python. На сервере развертывания (Ubuntu Linux 8.10) он отлично работает через runserver, но не работает через apache в mod-python.

Я сократил причину до части приложения, которое использует Berkeley DB (bsddb.db) и вторичные ключи. Метод обратного вызова для вторичных ключей использует pickle для форматирования ключей. Это не удается, когда я вызываю pickle для одного значения. Однако это не работает только тогда, когда я использую cPickle, и использование pickle для тех же значений вне функции обратного вызова также работает.

Я просто хочу знать, почему он не работает с cPickle.

Ответы:


164

По умолчанию исключения уже распечатываются до завершения программы. Если вы хотите отправить ошибку в другое место (не распечатывать ее), вы можете сделать это:

try:
    something()
except Exception as e:
    send_somewhere(traceback.format_exception(*sys.exc_info()))
    raise # reraises the exception

обратите внимание, что этот формат с использованием asключевого слова предназначен для python> 2.6. Старый способ был:

except Exception, e:

5
не знал об изменении "Exception as e". "Exception, e" всегда меня беспокоило, приятно видеть, что его убрали.
monkut

3
Ключевое слово as предназначено для python> = 2.6
pixelbeat

Такое простое решение. Тем не менее, я гулю его раз в два месяца, нажимаю на верхнюю ссылку и оказываюсь здесь.
NICK CAMel

3

Модуль трассировки очень полезен для форматирования трассировок. Затем вы можете записать это в файл журнала.


1

Это работает? :

except BaseException, e:

10
Вы не должны ловить BaseException- сюда входят SystemExitи KeyboardInterruptвещи, которые вы обычно не хотите ловить.
носкло
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.