[Twisted-Python] PB Error (printing exceptions in deferreds)

Hi all,
I am trying to develop an application with twisted and using Pb. I have a trouble that I couldn't fix. I tried googling to find an solution, but didn't find an exact answer.
The problem is "I don't want exceptions be printed in server side". The solution already exists in Pb, if I raise an exception derived from pb.Error in a (view, execute, ...) method. However, if I raise the same exception in a deferred or callback function, the exception is printed. Here is an example,
server.py : Works as I expect server2.py : Prints the exceptions, which I don't want client.py : Catches the exception in both ways
Is there a solution which works in any way to avoid printing for specific exceptions.
Best regards, Musti
============== server.py (works well)============ #! /usr/bin/python
from twisted.spread import pb from twisted.internet import reactor
class MyError(pb.Error): pass
class One(pb.Root): def remote_broken(self): msg = "fall down go boom" raise MyError(msg)
def main(): reactor.listenTCP(8800, pb.PBServerFactory(One())) reactor.run()
if __name__ == '__main__': main() =======================================
=========== server2.py (prints exceptions)============ #! /usr/bin/python
from twisted.spread import pb from twisted.internet import reactor from twisted.internet import defer
class MyError(pb.Error): pass
class One(pb.Root):
def badFoo(self, result): msg = "fall down go boom" raise MyError(msg)
def remote_broken(self): d = defer.Deferred() d.addCallback(self.badFoo) d.callback(0) return d
def main(): reactor.listenTCP(8800, pb.PBServerFactory(One())) reactor.run()
if __name__ == '__main__': main() ==========================================
=== client.py (works same for both server and server2)======= #! /usr/bin/python
from twisted.spread import pb from twisted.internet import reactor
def main(): factory = pb.PBClientFactory() reactor.connectTCP("localhost", 8800, factory) d = factory.getRootObject() d.addCallbacks(got_obj) reactor.run()
def got_obj(obj): # change "broken" into "broken2" to demonstrate an unhandled exception d2 = obj.callRemote("broken") d2.addCallback(working) d2.addErrback(broken)
def working(): print "erm, it wasn't *supposed* to work.."
def broken(reason): print "got remote Exception" print " .type =", reason.type reactor.stop()
main() =============================================
participants (1)
-
Mustafa Sakalsiz