2010-12-01 10 views
14

Tengo un código que maneja una excepción, y quiero hacer algo específico solo si es una excepción específica, y solo en modo de depuración. Así, por ejemplo:Manejar tipo de excepción específica en python

try: 
    stuff() 
except Exception as e: 
    if _debug and e is KeyboardInterrupt: 
     sys.exit() 
    logging.exception("Normal handling") 

Como tal, no quiero añadir sólo una:

except KeyboardInterrupt: 
    sys.exit() 

porque yo estoy tratando de mantener la diferencia en el código de depuración mínimo

+1

lo que realmente qué lo preguntas? – Marii

Respuesta

18

Bueno, en realidad, es probable que debe tener el controlador para KeyboardInterrupt separado. ¿Por qué solo querría manejar las interrupciones del teclado en modo de depuración, pero tragarlas de lo contrario?

Dicho esto, se puede utilizar isinstance para comprobar el tipo de un objeto:

try: 
    stuff() 
except Exception as e: 
    if _debug and isinstance(e, KeyboardInterrupt): 
     sys.exit() 
    logger.exception("Normal handling") 
+0

Esto es en un sistema integrado que se ejecuta sin un shell. Así que posiblemente solo podamos obtener una interrupción de teclado en modo de depuración. Así que solo manejamos todas las excepciones. – Falmarri

+0

esinstancia. eso es lo que estoy buscando. thx – Falmarri

19

Este es más o menos de la manera en que está hecho.

try: 
    stuff() 
except KeyboardInterrupt: 
    if _debug: 
     sys.exit() 
    logging.exception("Normal handling") 
except Exception as e: 
    logging.exception("Normal handling") 

Hay una mínima repetición. No es cero, sin embargo, es mínimo.

Si el "manejo normal" es más de una línea de código, puede definir una función para evitar la repetición de las dos líneas de código.

+0

Usted me ganó por 30 segundos, creo que – Velociraptors

+0

Es "excepto Excepción, e:" – marcog

+5

@marcog: 'excepto Excepción ya que e' es válido en Python 2.6+. – mipadi

0

¿Qué hay de malo en

try: 
    stuff() 
except KeyboardInterrupt: 
    if _debug: 
     logging.exception("Debug handling") 
     sys.exit() 
    else: 
     logging.exception("Normal handling") 
0

utilizar el método estándar mencionado en otras respuestas, o si realmente desea probar dentro del bloque, excepto continuación, puede utilizar isinstance().

try: 
    stuff() 
except Exception as e: 
    if _debug and isinstance(e, KeyboardInterrupt): 
     sys.exit() 
    logging.exception("Normal handling") 
1

Se debe dejar que la burbuja KeyboardInterrupt todo el camino hacia arriba y atrapar al más alto nivel.

if __name__ == '__main__': 
    try: 
     main() 
    except KeyboardInterrupt: 
     sys.exit() 
    except: 
     pass 

def main(): 
    try: 
     stuff() 
    except Exception as e: 
     logging.exception("Normal handling") 
     if _debug: 
      raise e 
0
try: 
    stuff() 
except KeyboardInterrupt: 
    if _debug: 
     sys.exit() 
    logging.exception("Normal handling") 
except ValueError: 
    if _debug: 
     sys.exit() 
    logging.exception("Value error Normal handling") 
else: 
    logging.info("One more message without exception") 
+1

-1: 'else' debería ser 'except', la cláusula 'else' es para que el código se ejecute si no hay excepción. –

+0

Sí, la rama 'else' se ejecutará cuando no haya excepción. Es solo por ejemplo. Pero tienes razón, debería editar el código del ejemplo para mostrar el estado del programa "real". – Lex

0

Puede nombrar excepciones específicas en Python:

try: 
    stuff() 
except KeyboardInterrupt: 
    sys.exit() 
except Exception: 
    normal_handling() 
Cuestiones relacionadas