[Twisted-Python] How to chain deferred calls

Paul Goins general at vultaire.net
Thu Oct 22 17:41:56 MDT 2009


Hello,

>>> On Oct 21, 2009, at 4:12 PM, vitaly at synapticvision.com wrote:
>>>
>>>> hi,
>>>> how can I chain in defer methods that could raise exception while
>>>> showing the exception that coming from method?

This is covered in the Twisted documentation.  There's 3 pages I often
have reviewed when confused about something:

1. Asynchronous Programming with Twisted
(http://twistedmatrix.com/projects/core/documentation/howto/async.html)
2. Deferred Reference
(http://twistedmatrix.com/projects/core/documentation/howto/defer.html)
3. Generating Deferreds
(http://twistedmatrix.com/projects/core/documentation/howto/gendefer.html)

Specifically, the most relevant is the Visual Explanation:
http://twistedmatrix.com/projects/core/documentation/howto/defer.html#auto2
This should give you the info you need, but I'll explain a little more
anyway.

>>>> I mean, if I'll do:
>>>> return (
>>>>   adc1().abc2().abc3().addErrback("Common2AllException")
>>>> )
>>>> than "Common2AllException" will be raised if abc1() raise Exception,
>>>> but I'd like to see the adc1() own exception (and not
>>>> "Common2AllException") ?

If abc1 raises an exception, it's going to go through each step of the
callback/errback chain until it finds an errback.  If the only thing you
have is attached at the very end, then that's where the exception will
be handled.

> the issue is if adc1() will raise up an exception, than following it
> .addErrback() will never be called cause adc1() will exit or raise
> Exception.

Let's say that your abc() was returning a Deferred.  In this case, doing
abc().addErrback("Common2AllException") would make sense.  However, your
example either returns 1 (not a Deferred), or it raises an Exception.
Neither one will chain like this.  The example is bad.

If you can provide a better example, please do.  In any case, please
review the documentation, especially the "visual explanation" I
mentioned above.  And finally, do a search on the web for "twisted
inlineCallbacks decorator" - that makes writing a lot of Deferred-using
code much easier, and helped me out a lot as a beginner.

- Paul





More information about the Twisted-Python mailing list