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.

Staale
quelle

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:
nosklo
quelle
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.


quelle
1

Funktioniert das? ::

except BaseException, e:
Swaroop CH
quelle
10
Du solltest nicht fangen BaseException- es beinhaltet SystemExitund KeyboardInterruptDinge, die du normalerweise nicht fangen willst.
Nosklo