Python 用织物处理故障

Python 用织物处理故障,python,deployment,fabric,Python,Deployment,Fabric,我正在尝试处理fabric上的失败,但我在文档中看到的示例太本地化了,不适合我的口味。如果许多操作中的任何一个失败,我需要执行回滚操作。然后,我尝试使用上下文来处理它,如下所示: @_contextmanager def failwrapper(): with settings(warn_only=True): result = yield if result.failed: rollback() abort("*********

我正在尝试处理fabric上的失败,但我在文档中看到的示例太本地化了,不适合我的口味。如果许多操作中的任何一个失败,我需要执行回滚操作。然后,我尝试使用上下文来处理它,如下所示:

@_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()
不幸的是,当其中一项任务失败时,我无法从
结果中获得任何信息


有没有办法做到这一点?或者有其他方法来处理这种情况吗?

根据我的测试,您可以通过以下方法来完成:

from contextlib import contextmanager

@contextmanager
def failwrapper():
    try:
        yield
    except SystemExit:
        rollback()
        abort("********* Failed to execute deploy! *********")
正如您所看到的,我去掉了warn_only设置,因为我认为如果可以执行回滚并且您正在使用abort()中止执行,则不需要它


结构遇到错误时引发SystemExit异常,并且未使用仅警告设置。我们可以捕获异常并进行回滚。

根据Henri的回答,这也可以处理键盘中断(Ctrl-C)和其他异常:

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