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.

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:

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.


1

¿Esto funciona? :

except BaseException, e:

10
No debe atrapar BaseException, incluye SystemExity KeyboardInterrupt, cosas que generalmente no desea atrapar.
nosklo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.