validar try tipos sirve que por pass para excepción excepciones ejemplos diferentes archivos anidados python exception-handling

tipos - try except anidados python



¿Tiene sentido un controlador de excepciones para toda la aplicación? (6)

Considere escribir un administrador de contexto y usar la declaración con.

Para resumir, 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.

Si mi aplicación falla, quiero asegurarme de que estos recursos del sistema se liberen 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

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


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


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 cuenta con dicho marco. 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!


Parece un enfoque razonable, más directo 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 por el estilo. Lo confundí por un largo tiempo).


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 caóticos, 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.


si usa clases, debería 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 lugar de usar un catch-all excepto :, debe usar el siguiente bloque:

try: main() finally: cleanup()

Eso asegurará la limpieza de una manera más pitonica.