[Twisted-Python] How to chain deferred calls
vitaly at synapticvision.com
vitaly at synapticvision.com
Thu Oct 22 18:15:40 MDT 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