2009-01-14 11 views
48

Tengo un comportamiento extremadamente extraño que parece dar como resultado excepciones silenciosas. ¿Cómo puedo escribir una captura general de prueba donde puedo depurar todas las excepciones? Algo a lo largo de las líneas de:Captura genérica para python

try: 
    # something that fails 
except e: 
    print e 

Un poco más sobre el problema en cuestión en detalle:

Tengo una aplicación Django que en la mi comp (Ubuntu Linux 8.10) funciona bien tanto a través de ejecución del servidor y mod -pitón. En el servidor de despliegue (Ubunut Linux 8.10) funciona bien a través de runserver, pero falla a través de apache en mod-python.

He reducido la causa a una parte de la aplicación que utiliza Berkeley DB (bsddb.db) y claves secundarias. El método de devolución de llamada para claves secundarias usa pickle para formatear las claves. Falla cuando llamo pickle en un solo valor. Sin embargo, solo falla cuando uso cPickle, y también funciona el uso de pickle en los mismos valores fuera de la función de devolución de llamada.

Solo quiero saber por qué falla con cPickle.

Respuesta

91

Las excepciones ya están impresas por defecto antes de la finalización del programa. Si desea enviar el error en otro lugar (no imprimir) se puede hacer esto:

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

nota que este formato usando la palabra clave as es para Python> 2.6. La forma antigua era:

except Exception, e: 
+0

Dale un golpe. :) –

+3

no sabía sobre el cambio "Excepción como e". "Excepción, e" siempre me molestó, es bueno ver que se limpió. – monkut

+3

'como' la palabra clave es para python> = 2.6 – pixelbeat

1

¿Funciona? :

except BaseException, e: 
+5

No debería detectar 'BaseException' - incluye' SystemExit' y 'KeyboardInterrupt', cosas que generalmente no desea capturar. – nosklo

+0

@nosklo Tienes razón –

2

El traceback module es bastante útil para formatear tracebacks. Luego puede escribirlo en un archivo de registro.

Cuestiones relacionadas