[Twisted-Python] Perspective broker and inlineCallbacks exception handling problem

Maik Friedmann maik.friedmann at googlemail.com
Tue Jan 6 05:43:58 EST 2009


Hello Again,

> The first thing to say is that you shouldn't send us pseudo code. It will
> help you understand what's going on if you write a small example and play
> with it. And that will help us help you because we'll be able to see
> exactly what's going on and run your code ourselves.

That is right, hopefully this new mail will explain what am I asking.

> Note that in the above snippet, you're using inlineCallbacks but you're not
> yielding anything. If you try calling this main() function, it will give
> you an exception: Failure instance: Traceback: <type
> 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'send'
>
> That's just an example of the subtleties (and it's not so sublte in this
> case), and underlines why you should send us real code.
>
> Are you actually trying to call main()?

You are right again, my mistake.

Anyway, I tried running the code you wrote and it works as expected.
My problem is handling exceptions raised on remote calls (via pb).
Attached three scripts are:

server.py: Server implementation, a basic perspective broker example
that includes a custom checker, which in turn uses inlineCallbacks.
client1.py: Client implementation 1, uses inlineCallbacks
client2.py: Client implementation 2, uses plain deferreds

Clients should be same in functionality AFAIK (noting that I am new to
inlineCallbacks). Both clients have wrong passwords configured, so
that they will fail in checker with a custom exception derived from
pb.Error.

My problem is, with the plain deferred version (client2.py), it is
easy to handle (inspect) the error in a errback since I got a Failure
object. However, for inline callbacks, the only way I can catch the
error is using this ugly code (copied from client1.py):

        try:
            ... (pb related calls)
        except:
            print 'Login Failed:',
            print sys.exc_info()[0]

Even this does not catch the error:

        try:
            ... (pb related calls)
        except Exception, e:
            print 'Login Failed:',
            print sys.exc_info()[0]

Furthermore, inlineCallbacks version also prints this deprecation warning:

/usr/lib/python2.5/site-packages/twisted/python/failure.py:331:
DeprecationWarning: raising string exceptions is deprecated
  return g.throw(self.type, self.value, self.tb)

Is there a better way to do this, or am I missing something? BTW I am
running this on a Ubuntu 8.10 (Twisted 8.1).

Regards,
Maik
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: server.py
Url: http://twistedmatrix.com/pipermail/twisted-python/attachments/20090106/699fea36/attachment.txt 
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: client1.py
Url: http://twistedmatrix.com/pipermail/twisted-python/attachments/20090106/699fea36/attachment-0001.txt 
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: client2.py
Url: http://twistedmatrix.com/pipermail/twisted-python/attachments/20090106/699fea36/attachment-0002.txt 


More information about the Twisted-Python mailing list