2012-05-31 47 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