[Twisted-Python] How to chain deferred calls
Andrew Bennetts
andrew at bemusement.org
Thu Oct 22 19:37:19 MDT 2009
vitaly at synapticvision.com wrote:
[...]
> 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.
This is a function that either returns a Deferred or raises an exception. This
isn't a Twisted issue, it's simply a Python one: in “func1().func2()”, if func1
raises an exception then func2 will not be invoked. That's fundamental to what
raising an exception in Python means.
If you want to convert this to something that always returns a Deferred, you can
either rewrite it, e.g. using “return defer.fail(Exception('Error11'))”, or use
maybeDeferred which will intercept exceptions for you, e.g.:
return (
maybeDeferred(self.abc1).
addErrback(self.handleFailure1).
# etc...
)
You can find maybeDeferred in the twisted.internet.defer module.
-Andrew.
More information about the Twisted-Python
mailing list