Загальний улов для python


86

У мене надзвичайно дивна поведінка, яка, здається, призводить до тихих винятків. Як я можу написати загальний спробний улов, де я можу налагодити всі винятки. Щось на зразок:

try:
    # something that fails
except e:
    print e

Детальніше про розглянуту проблему детально:

У мене є програма Django, яка на моєму комп’ютері (Ubuntu Linux 8.10) чудово працює як через runserver, так і через mod-python. На сервері розгортання (Ubuntu Linux 8.10) він чудово працює через сервер запуску, але не працює через apache в mod-python.

Я звів причину до частини програми, яка використовує Berkeley DB (bsddb.db) та вторинні ключі. Метод зворотного дзвінка для вторинних клавіш використовує розсол для форматування ключів. Це не вдається, коли я називаю розсол за одним значенням. Однак це не вдається лише тоді, коли я використовую cPickle, і використання засолу на тих самих значеннях поза функцією зворотного виклику також працює.

Я просто хочу знати, чому це не вдається з 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
не знав про зміну "Виняток як e". "Виняток, e" завжди мене прослуховував, приємно бачити, як його очистили.
monkut

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

Таке просте рішення. Тим не менше, я гуглюю його раз у місяць, натискаю на верхнє посилання і опиняюся тут.
niCk cAMel

3

Модуль відстеження досить корисний для форматування зворотних зв’язків. Потім ви можете записати його у файл журналу.


1

Це працює? :

except BaseException, e:

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