[Twisted-Python] Perspective broker and inlineCallbacks exception handling problem
Maik Friedmann
maik.friedmann at googlemail.com
Mon Jan 5 08:55:11 MST 2009
Hello,
I am developing a basic client/server application based on twisted.
For communication purposes I am using perspective broker. I have
problems with inlineCallbacks and remotely raised errors:
My client code looks like this (pseudo code):
class Client:
@defer.inlineCallbacks
def login(self, prms):
self.factory = pb.PBClientFactory()
reactor.connect(host, port)
self.perspective = yield self.factory.login()
self.services = yield self.perspective.callRemote('getClientServices')
When using this class in application, I want to handle errors raised remotely:
@defer.inlineCallbacks
def main():
client = Client()
try:
yield client.login(prms)
except Exception, e:
print 'Handled exception:', e
However, no matter what is raised on remote side, except block is
never used. But if I change the code to plain except, exception is
handled:
@defer.inlineCallbacks
def main():
client = Client()
try:
client.login(prms)
except:
print 'Some error occurred'
If I rewrite this function using classic deferred style, it works as
excepted (prints error with the correct type):
def eb_failure(failure):
print type(failure), failure
def cb_success(result):
print 'OK', result
def main():
client = Client()
d = client.login(prms)
d.addCallbacks(cb_success, eb_failure)
I am purposely raising errors derived from pb.Error. Using the
inlineCallbacks version I can only inspect remote errors with
sys.exc_info(), and that results in a plain string object, which
includes the classname of the original error like
'myerror.MyAuthenticationError'
What am I doing wrong? Is there a way to resolve this?
Regards,
Maik
More information about the Twisted-Python
mailing list