2012-05-31 52 views
5

我試圖處理織物上的故障,但我在文檔中看到的示例太過本地化,不適合我的口味。如果任何一個操作失敗,我需要執行回滾操作。我試過了,然後,利用上下文來處理它,就像這樣:處理織物故障

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

然後

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

不幸的是,當這些任務之一失敗,我不上result得到任何東西。

有沒有辦法完成這個?還是有另一種處理這種情況的方式?

回答

6

根據我的測試,你可以完成與此:

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

正如你可以看到我擺脫了warn_only設置的,我想你不需要它,如果回滾執行,無論如何你都要用abort()來中止執行。

Fabric在遇到錯誤時會引發SystemExit異常,並且不會使用warn_only設置。我們可以捕捉異常並進行回滾。

1

從亨利的回答繼,這也是處理鍵盤中斷(CTRL-C)和其他異常:

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