Cattura generica per python


89

Ho un comportamento estremamente strano che sembra tradursi in eccezioni silenziose. Come posso scrivere un try catch generale in cui posso eseguire il debug di tutte le eccezioni. Qualcosa sulla falsariga di:

try:
    # something that fails
except e:
    print e

Qualcosa in più sul problema in questione in dettaglio:

Ho un'app Django che sul mio computer (Ubuntu Linux 8.10) funziona bene sia tramite runserver che mod-python. Sul server di distribuzione (Ubuntu Linux 8.10) funziona bene tramite runserver, ma fallisce tramite apache in mod-python.

Ho ridotto la causa a una parte dell'app che utilizza Berkeley DB (bsddb.db) e le chiavi secondarie. Il metodo di callback per le chiavi secondarie utilizza pickle per formattare le chiavi. Non riesce quando chiamo pickle su un singolo valore. Tuttavia, fallisce solo quando uso cPickle e anche l'uso di pickle sugli stessi valori al di fuori della funzione di callback funziona.

Voglio solo sapere perché non funziona con cPickle.

Risposte:


169

Le eccezioni vengono già stampate per impostazione predefinita prima della fine del programma. Se vuoi inviare l'errore da qualche altra parte (non stamparlo) puoi farlo:

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

nota che questo formato che utilizza la asparola chiave è per python> 2.6. Il vecchio modo era:

except Exception, e:

5
non sapeva della modifica "Eccezione come e". "Eccezione, e" mi ha sempre infastidito, è bello vedere che è stato ripulito.
monkut

3
La parola chiave "as" è per python> = 2.6
pixelbeat

Una soluzione così semplice. Eppure lo cerco su Google ogni due mesi e faccio clic sul collegamento in alto e finisco qui.
niCk camel

3

Il modulo traceback è abbastanza utile per formattare i traceback. È quindi possibile scriverlo in un file di registro.


1

funziona? :

except BaseException, e:

11
Non dovresti catturare BaseException- include SystemExite KeyboardInterrupt, cose che di solito non vuoi catturare.
nosklo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.