Captura genérica para python

86

Tengo un comportamiento extremadamente extraño que parece resultar en excepciones silenciosas. ¿Cómo puedo escribir una captura de prueba general donde puedo depurar todas las excepciones? Algo parecido a:

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 mi computadora (Ubuntu Linux 8.10) funciona bien tanto a través de runserver como de mod-python. En el servidor de implementación (Ubuntu 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 usa 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 a pickle en un solo valor. Sin embargo, solo falla cuando uso cPickle, y usar pickle en los mismos valores fuera de la función de devolución de llamada también funciona.

Solo quiero saber por qué falla con cPickle.

Staale
fuente

Respuestas:

164

Las excepciones ya se imprimen de forma predeterminada antes de la finalización del programa. Si desea enviar el error a otro lugar (no imprimirlo) puede hacer esto:

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

tenga en cuenta que este formato que usa la aspalabra clave es para python> 2.6. La forma antigua era:

except Exception, e:
nosklo
fuente
5
no sabía sobre el cambio "Excepción como e". "Exception, e" siempre me molestaba, es bueno ver que se limpió.
monkut
3
La palabra clave 'as' es para python> = 2.6
pixelbeat
Una solución tan simple. Sin embargo, lo busco en Google cada dos meses, hago clic en el enlace superior y termino aquí.
niCk cAMel
3

El módulo de rastreo es bastante útil para formatear los rastreos. Luego puede escribirlo en un archivo de registro.


fuente
1

¿Esto funciona? :

except BaseException, e:
Swaroop CH
fuente
10
No debe atrapar BaseException, incluye SystemExity KeyboardInterrupt, cosas que generalmente no desea atrapar.
nosklo