我正在尝试处理布料上的故障,但我在文档上看到的示例太过本地化,不符合我的口味。如果许多操作中的任何一个失败,我需要执行回滚操作。然后,我尝试使用上下文来处理它,如下所示:
@_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
上没有得到任何内容。
有没有办法实现这个目标?还是有另一种处理这种情况的方法吗?
答案 0 :(得分:7)
根据我的测试,你可以用这个来实现:
from contextlib import contextmanager
@contextmanager
def failwrapper():
try:
yield
except SystemExit:
rollback()
abort("********* Failed to execute deploy! *********")
正如你所看到的,我摆脱了warn_only设置,因为我认为如果可以执行回滚并且你使用abort()中止了执行,你就不需要它。
Fabric遇到错误时引发SystemExit异常,并且未使用warn_only设置。我们可以捕获异常并进行回滚。
答案 1 :(得分:1)
根据Henri的回答,这也处理键盘中断(Ctrl-C)和其他例外:
@_contextmanager
def failwrapper():
try:
yield
except:
rollback()
raise