2012-05-31 3 views
5

Sto tentando di gestire l'errore su fabric, ma l'esempio che ho visto sui documenti era troppo localizzato per i miei gusti. Devo eseguire azioni di rollback se uno qualsiasi di un certo numero di azioni fallisce. Ho cercato, quindi, di utilizzare contesti per gestire la cosa, in questo modo:Gestione dei guasti con Fabric

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

E poi

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

Purtroppo, quando uno di questi compiti non riescono, non ottengo nulla sul result.

C'è qualche modo per realizzare questo? O c'è un altro modo di gestire queste situazioni?

risposta

6

Secondo le mie prove, si può realizzare che con questo:

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

Come potete vedere ho eliminato l'impostazione warn_only come suppongo che non è necessario se il rollback può essere eseguito e stai annullando l'esecuzione comunque con abort().

Il tessuto solleva eccezione SystemExit quando si verificano errori e l'impostazione warn_only non viene utilizzata. Possiamo solo prendere l'eccezione e fare il rollback.

1

A seguito di risposta di Henri, questo gestisce anche gli interrupt di tastiera (Ctrl-C) e altre eccezioni:

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