2008-09-18 9 views
10

En resumen, tengo una aplicación de Python sustancial que, entre otras cosas, hace llamadas a "losetup", "mount", etc. en Linux. Esencialmente consume recursos del sistema que deben liberarse cuando se completen.¿Tiene sentido un controlador de excepciones para toda la aplicación?

Si mi aplicación falla, quiero asegurarme de que estos recursos del sistema se hayan liberado correctamente.

¿Tiene sentido hacer algo como lo siguiente?

def main(): 
    # TODO: main application entry point 
    pass 

def cleanup(): 
    # TODO: release system resources here 
    pass 

if __name__ == "__main__": 
    try: 
     main() 
    except: 
     cleanup() 
     raise 

¿Esto es algo que normalmente se hace? ¿Hay una mejor manera? Tal vez el destructor en una clase singleton?

Respuesta

11

Me gustan los manejadores de excepciones de nivel superior en general (independientemente del idioma). Son un excelente lugar para limpiar los recursos que pueden no estar relacionados de inmediato con los recursos consumidos dentro del método que arroja la excepción.

También es un lugar fantástico para registrar esas excepciones si tiene un marco así. Los manejadores de alto nivel captarán las extrañas excepciones que no planeaste y te permitirán corregirlas en el futuro; de lo contrario, es posible que nunca las conozcas.

¡Solo tenga cuidado de que su manejador de nivel superior no arroje excepciones!

+0

Los manejadores de excepciones de nivel superior son útiles en las aplicaciones GUI. Las excepciones no detectadas lanzadas en los controladores de eventos aparecerán en la consola, pero en general no bloquearán el programa (por ejemplo, en PyGTK y PyQt), esto puede pasar desapercibido. Si muestra un cuadro de diálogo de error en el controlador, no tiene ese problema. –

+0

También te sugiero que las pongas en aplicaciones de consola que procesen por lotes. Les pido que envíen un correo electrónico para que podamos notificarnos de cualquier problema, pero al menos podría iniciar sesión. –

2

El controlador de aplicaciones está bien. Son geniales para iniciar sesión. Solo asegúrese de que la aplicación ancha sea duradera y no se bloquee.

7

Un destructor (como en un método __del__) es una mala idea, ya que no se garantiza que se invoquen. El módulo atexit es un enfoque más seguro, aunque no se activará si el intérprete de Python falla (en lugar de la aplicación Python), o si se usa os._exit(), o el proceso se elimina de forma agresiva, o la máquina se reinicia. (Por supuesto, el último elemento no es un problema en su caso). Si su proceso es propenso a bloqueos (utiliza módulos de extensión de terceros cautos, por ejemplo) es posible que desee realizar la limpieza en un proceso principal simple para más aislamiento.

Si no está realmente preocupado, use el módulo atexit.

+0

No estaba completamente seguro de que se llamaría tampoco al destructor. ¡Gracias por la aclaración! Parece que atexit es lo que necesito. – EmmEff

1

Parece un enfoque razonable, y más sencillo y confiable que un destructor en una clase singleton. También puede consultar el módulo "atexit". (Pronunciado "al salir", no "un tex it" o algo así. Lo confundí por un largo tiempo)

2

si usa clases, debe liberar los recursos que asignan en sus destructores, por supuesto . Use la opción try: en toda la aplicación solo si desea liberar recursos que no hayan sido liberados por los destructores de sus clases.

Y en vez de usar un cajón de sastre, excepto :, se debe utilizar el siguiente bloque:

try: 
    main() 
finally: 
    cleanup() 

que asegurará la limpieza de una manera más Pythonic.

1

Considere escribir un administrador de contexto y usar la instrucción with.

Cuestiones relacionadas