2012-05-31 2 views
5

Я пытаюсь справиться с ошибкой на ткани, но пример, который я видел на документах, был слишком локализован для моего вкуса. Мне нужно выполнить действия отката, если какой-либо из нескольких действий терпит неудачу. Я попробовал, то, чтобы использовать контексты, чтобы справиться с этим, как это:Обработка ошибок с помощью 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() 

К сожалению, когда одна из этих задач не получится, я не получаю ничего на 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 
Смежные вопросы