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.

有没有办法做到这一点?或者是否有另一种处理这种情况的方法?

4

2 回答 2

7

根据我的测试,您可以这样做:

from contextlib import contextmanager

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

正如您所看到的,我摆脱了 warn_only 设置,因为我认为如果可以执行回滚并且您无论如何都使用 abort() 中止执行,则您不需要它。

Fabric 在遇到错误并且未使用 warn_only 设置时引发 SystemExit 异常。我们可以捕获异常并进行回滚。

于 2012-05-31T12:16:34.030 回答
1

继亨利的回答之后,这也处理键盘中断(Ctrl-C)和其他异常:

@_contextmanager
def failwrapper():
    try:
        yield
    except:
        rollback()
        raise
于 2014-04-14T18:34:04.457 回答