[Twisted-Python] How to chain deferred calls

vitaly at synapticvision.com vitaly at synapticvision.com
Thu Oct 22 20:15:40 EDT 2009


Thank you a lot for pointing me to the Twisted doc-s, but we're  
discussing the following snippet:

return (
     self.abc1().
     addErrback(self.handleFailure1).
     addCallback(self.abc2,args).
     addCallback(self.abc3).
     addErrback(self.handleFailure2)
)


def abc1(self):
     if t.test() is None:
       raise Exception("Error11")
     else:
       d = defer.Deferred()
       d.callback(1)
       return d


and basically, I've expected in case of exception  
self.handleFailure1() to be called, but I don't see it happen.

cheers.


Quoting "Paul Goins" <general at vultaire.net>:

> 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
>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>





More information about the Twisted-Python mailing list