On 01:04 am, courn...@gmail.com wrote: >but not what I consider the meat of my issue, that is >the lack of traceback. Fixing and simplifying my initial example: > >import twisted.web.client > >from twisted.internet import defer >from twisted.internet import reactor > >def remote_call(): > d = twisted.web.client.getPage("http://localhost:8083") > return d > >def main(): > d = remote_call() > def _stop(arg): > reactor.stop() > return arg > d.addBoth(_stop) > >reactor.callWhenRunning(main) >reactor.run() > >This will correctly signal an error, but the output: > >Unhandled error in Deferred: >Unhandled Error >Traceback (most recent call last): >Failure: twisted.internet.error.ConnectionRefusedError: Connection was >refused by other side: 61: Connection refused. > >is not informative. I was hoping for a way to know that the error >happens inside remote_call through e.g. an errback in main. If this is >not possible, how do people generally handle those issues in >asynchronous code ?
log.err takes an additional argument which you can use easily like this: def main(): d = remote_call() d.addErrback(log.err, "remote_call failed") def _stop(ignored): reactor.stop() d.addCallback(_stop) The message you pass here will replace the "Unhandled error in Deferred" text in the report of the failure. Another option is to enable Deferred debugging, which I think someone mentioned earlier in the thread: from twisted.internet.defer import setDebugging setDebugging(True) or twistd --debug ... or trial --debug ... This causes Deferred to capture the stack at the time it is created and the time it is called back. The "Unhandled error" case will log this information. This should give you the traceback you want. This is not enabled by default because (I suppose) capturing stacks is very expensive. Jean-Paul _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python