2012-05-31 20 views
5

Estoy tratando de manejar fallas en la tela, pero el ejemplo que vi en los documentos estaba demasiado localizado para mi gusto. Necesito ejecutar acciones de reversión si falla una de una serie de acciones. He intentado, a continuación, utilizar los contextos para manejarlo, así:Manejo de fallas con la tela

@_contextmanager 
def failwrapper(): 
    with settings(warn_only=True): 
     result = yield 
    if result.failed: 
     rollback() 
     abort("********* Failed to execute deploy! *********") 

Y luego

@task 
def deploy(): 
    with failwrapper(): 
     updateCode() 
     migrateDb() 
     restartServer() 

Por desgracia, cuando una de estas tareas fallan, no tengo nada en result.

¿Hay alguna forma de lograr esto? ¿O hay otra forma de manejar tales situaciones?

Respuesta

6

Según mis pruebas, se puede lograr que con esto:

@_contextmanager 
def failwrapper(): 
    try: 
     yield 
    except SystemExit: 
     rollback() 
     abort("********* Failed to execute deploy! *********") 

Como se puede ver que se deshizo de la configuración warn_only como supongo que no lo necesita, si la reversión puede ser ejecutado y estás abortando la ejecución de todos modos con abort().

La tela aumenta la excepción de SystemExit al encontrar errores y no se usa la configuración warn_only. Podemos atrapar la excepción y hacer la reversión.

1

A raíz de la respuesta de Henri, esto también maneja las interrupciones de teclado (Ctrl-C) y otras excepciones:

@_contextmanager 
def failwrapper(): 
    try: 
     yield 
    except: 
     rollback() 
     raise