[Python] sys.excepthook e ipdb

Pietro Battiston me a pietrobattiston.it
Mar 15 Gen 2013 09:32:53 CET


Dovendo fare un lavoro di analisi in cui l'errore è sempre dietro
l'angolo (tranquilli, niente da mandare in produzione), sto riempiendo
il mio codice di cose tipo

try:
    ...
except:
    import ipdb; ipdb.set_trace()


Tipicamente, intervenendo con ipdb riesco a risolvere il problema e poi
a dare "continue".

Ho pensato di fare il passo successivo: avviare ipdb ad ogni uncaught
Exception. Ho trovato http://code.activestate.com/recipes/65287/ , e
sostituito "pdb" con "ipdb". Ma c'è un problema: ipdb parte sì, ma
quando poi do "continue" non mi esegue il codice successivo. Se poi
sostituisco "pm()" con "set_trace()", il "continue" mi dà pure errore.

Ciò mi fa pensare che sys.excepthook non sia quello che mi serve (e in
effetti la documentazione¹ dice "this happens just before control is
returned to the prompt"). Qualcuno ha consigli migliori?

Il problema di un unico try... except globale è chiaramente che io
vorrei lavorare là (nella funzione) dove l'errore nasce.

Per riprodurre, potete usare

----8<--------8<--------8<--------8<--------8<--------8<--------8<----

def prova():
    i = "a"
    print int(i)
    print "vado avanti"

prova()

----8<--------8<--------8<--------8<--------8<--------8<--------8<----

Idealmente, facendolo girare dovrei:
- ottenere un'exception a causa del casting a int, e quindi avviare ipdb
- essere in grado di appurare, dall'interno del debugger, che "i" vale
"a"
- fare eseguire il secondo print


ciao

Pietro

¹ http://docs.python.org/2/library/sys.html



Maggiori informazioni sulla lista Python