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()

残念ながら、これらのタスクの 1 つが失敗すると、何も得られません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() を使用して実行を中止する場合は必要ないと思われるためです。

エラーが発生し、warn_only 設定が使用されていない場合、Fabric は SystemExit 例外を発生させます。例外をキャッチしてロールバックするだけです。

于 2012-05-31T12:16:34.030 に答える
1

Henri の回答に続いて、これはキーボード割り込み (Ctrl-C) およびその他の例外も処理します。

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