1

やや単純なツイストPythonコードを理解するのに問題があります。私がドキュメントで赤字にしていることから、ここのコードは未処理のエラーなしで機能するはずです。

私はこれを手に入れます:

HELLO!
HANDLED!
HANDLED 2!
Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
  File "package_tester.py", line 31, in <module>
    a().callback(2)
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 368, in callback
    self._startRunCallbacks(result)
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 464, in _startRunCallbacks
    self._runCallbacks()
--- <exception caught here> ---
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py", line 551, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "package_tester.py", line 5, in c
    raise Exception()
exceptions.Exception:

連鎖延期による失敗はend()errbackに渡されませんか?

何らかの理由で、Bulaの投稿の下にコメントすることはできません。
単に追加するだけで、「unexpected1.py」の動作を回避することができました。

@defer.inlineCallbacks
def sync_deferred(self, result, deferred):
        """
        Wait for a deferred to end before continuing.
        @param deferred: deferred which will be waited to finish so the chain
        can continue.
        @return: result from the deferred.
        """
        r = yield deferred
        defer.returnValue(r)

すべてのchainDeferredの後にsync_deferredが実行されます。この場合、親がこの結果を続行できるように、子の遅延の結果を「待機」する必要があります。

4

2 に答える 2

1

のドキュメントDeferred.chainDeferredから:

When you chain a deferred d2 to another deferred d1 with d1.chainDeferred(d2),
you are making d2 participate in the callback chain of d1. Thus any event that
fires d1 will also fire d2.

(サンプルコードで)提供したエラーはd1dサンプルコードで)に渡されます。これは、/がエラーで終了し、最初で唯一のerrbackに渡されることを意味します。 引数を返し、/にエラー結果を残しますが、これは処理されません。d2ld2lnew_fnew_fd2l

失敗を処理するつもりならnew_f、失敗を「返さない」ようにする必要があります。ハウツーから:_Deferred

If the errback does returns a Failure or raise an exception, then that is passed
to the next errback, and so on.
于 2012-11-27T17:02:40.677 に答える
1

この優れた投稿ではを使用するときに発生する可能性のある潜在的な問題の例がいくつかありchainDeferredます。したがって、この方法を使用する場合は注意が必要です。

于 2012-11-27T22:27:24.963 に答える