Generischer Fang für Python


83

Ich habe ein extrem seltsames Verhalten, das zu stillen Ausnahmen zu führen scheint. Wie kann ich einen allgemeinen Try-Catch schreiben, in dem ich alle Ausnahmen debuggen kann? Etwas in der Art von:

try:
    # something that fails
except e:
    print e

Ein bisschen mehr über das Problem im Detail:

Ich habe eine Django-App, die auf meinem Computer (Ubuntu Linux 8.10) sowohl über Runserver als auch über Mod-Python einwandfrei funktioniert. Auf dem Bereitstellungsserver (Ubuntu Linux 8.10) funktioniert es einwandfrei über den Runserver, schlägt jedoch über Apache in Mod-Python fehl.

Ich habe die Ursache auf einen Teil der App reduziert, der Berkeley DB (bsddb.db) und Sekundärschlüssel verwendet. Die Rückrufmethode für Sekundärschlüssel verwendet Pickle zum Formatieren der Schlüssel. Es schlägt fehl, wenn ich pickle für einen einzelnen Wert aufrufe. Es schlägt jedoch nur fehl, wenn ich cPickle verwende, und die Verwendung von pickle für dieselben Werte außerhalb der Rückruffunktion funktioniert ebenfalls.

Ich möchte nur wissen, warum es mit cPickle fehlschlägt.

Antworten:


161

Ausnahmen werden bereits vor Programmbeendigung standardmäßig gedruckt. Wenn Sie den Fehler an eine andere Stelle senden möchten (nicht ausdrucken), können Sie Folgendes tun:

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

Beachten Sie, dass dieses Format mit dem asSchlüsselwort für Python> 2.6 ist. Der alte Weg war:

except Exception, e:

5
wusste nichts über die Änderung "Ausnahme als e". "Ausnahme, e" nervte mich immer, schön zu sehen, dass es aufgeräumt wurde.
Mönch

3
'as' Schlüsselwort ist für Python> = 2.6
Pixelbeat

So eine einfache Lösung. Trotzdem google ich es jeden zweiten Monat und klicke auf den Top-Link und lande hier.
NiCk Camel

3

Das Traceback-Modul ist sehr nützlich zum Formatieren von Tracebacks. Sie können es dann in eine Protokolldatei schreiben.


1

Funktioniert das? ::

except BaseException, e:

10
Du solltest nicht fangen BaseException- es beinhaltet SystemExitund KeyboardInterruptDinge, die du normalerweise nicht fangen willst.
Nosklo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.