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@vultaire.net>:
Hello,
On Oct 21, 2009, at 4:12 PM, vitaly@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@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python