2012-05-31 9 views
5

Ich versuche Versagen auf Stoff zu behandeln, aber das Beispiel, das ich auf der docs sah auch war für meinen Geschmack lokalisiert. Ich muss Rollback-Aktionen ausführen, wenn einige der Aktionen fehlschlagen. Ich habe versucht, dann, Kontexte zu verwenden, es zu handhaben, wie folgt aus:Handhabung Ausfälle mit Stoffe

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

Und dann

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

Leider, wenn eine dieser Aufgaben nicht, ich habe nicht alles auf result.

Gibt es eine Möglichkeit, dies zu erreichen? Oder gibt es einen anderen Weg, solche Situationen zu bewältigen?

Antwort

6

Nach meinen Tests, können Sie das mit diesem erreichen:

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

Wie Sie mir der warn_only Einstellung losgeworden sehen können, wie ich Dich nehme an, es nicht brauchen, wenn das Rollback ausgeführt werden kann und Sie brechen die Ausführung trotzdem mit abort() ab.

Fabric löst die SystemExit-Ausnahme aus, wenn Fehler auftreten und die Einstellung warn_only wird nicht verwendet. Wir können nur die Ausnahme abfangen und den Rollback durchführen.

1

auf von Antwort des Henri Im Anschluss an diese Griffe auch Tastatur-Interrupts (Strg-C) und andere Ausnahmen:

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