2012-05-31 21 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に何かを得ることはありません。

これを達成する方法はありますか?あるいは、そのような状況を扱う別の方法がありますか?あなたは、私はロールバックを実行することができた場合、あなたがそれを必要としないと仮定して、私はwarn_only設定を処分した見ることができるように

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

答えて

6

私のテストによると、あなたはこれとそれを達成することができますとにかくabort()で実行を中止します。

ファブリックは、エラーが発生した場合にSystemExit例外を発生させ、warn_only設定を使用しません。私たちは例外をキャッチしてロールバックを行うことができます。アンリの答えに続き

1

が、これはまた、キーボード割り込み(Ctrl + Cキー)とその他の例外を処理します。

@_contextmanager 
def failwrapper(): 
    try: 
     yield 
    except: 
     rollback() 
     raise 
関連する問題