2009-04-29 14 views
5

En Python, ¿hay alguna característica de lenguaje (o intérprete) para forzar al intérprete de Python a que siempre genere excepciones incluso si la excepción del código ofensivo está dentro de un bloque try/except?Python - ¿Es posible forzar excepciones de excepción sin importar try/except blocks?

Acabo de heredar una base de código antigua y más grande escrita en python, cuyo propósito es comunicarnos con algún hardware diseñado a medida que también desarrollamos. Muchos errores de comunicación y los tiempos de espera se están enmascarados/perdidas debido al patrón siguiente (simplificado) de código:

try: 
    serialport.write(MSG) 
except: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    #or just: 
    #pass 

Con el fin de evitar el escenario típico de "simplemente reescribir toda la cosa desde cero", estoy Actualmente, estamos intentando solucionar todos los errores/tiempos de espera de excepciones. Estoy haciendo esto deshabilitando a mano el código de manejo de todas las excepciones, de a uno por vez.

+1

No puedo hablar con Python, ya que nunca lo he usado (de ahí que responda como un comentario en lugar de una respuesta real), pero la mayoría de los depuradores tienen la opción de "romper todas las excepciones". Esto también se puede llamar "excepciones de primera oportunidad". Permitiría que su código permanezca sin cambios, pero trata cada "lanzamiento" como un punto de interrupción. Verifique si su depurador tiene esa característica. – rmeador

Respuesta

11

El "all-excepciones" except: bloque es un muy malo y simplemente se debe encontrar y reemplazado con excepción sensata manejar.

En este caso grep es tu amigo. Un buen IDE puede ayudar a que estas tareas desagradables sean manejables.

Pero no hay opción de "ignorar el código tal como está escrito" en Python.

+1

+1 "ignorar el código tal como está escrito" :-) –

+1

pyparsing es una herramienta útil para hacer la transformación del código. –

-2

Puede usar varios manejadores de excepciones para manejar múltiples excepciones.

try: 
    serialport.write(MSG) 
except Handler1: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    #or just: 
    #pass 
except Handler2: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not2() 
    #or just: 
    #pass 
3

No, realmente no. Su mejor opción es cambiar el código a algo más parecido a esto:

try: 
    serialport.write(MSG) 
except: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    raise 

Esto hará que sea volver a elevar la excepción exacta. Lo principal que debe comprender es que si hubiera una forma de hacer que todas las excepciones salgan del sistema, no podría usar un bucle for (los iteradores generan una excepción StopIteration).

Cuestiones relacionadas