On Mon, Jul 16, 2012 at 11:20 PM, Andrew Bennetts
<andrew@bemusement.org> wrote:
Dan Stromberg wrote:
[…]
> I'm playing with twisted.internet.defer.setDebugging now.
>
> Is there a corresponding function that can be used to produce its report?
> If I use it in a program with an infinite loop, it seems like I never get
> the report, but if I use it in a program with a finite length, I eventually
> get a useful-looking report.
It's triggered by garbage collection of a Deferred with an unhandled error. So
you're at the mercy of when the garbage collector of your Python VM decides to
collect that object.
You could call yourDeferred._debugInfo._getDebugTracebacks() yourself, though,
if you don't mind (ab)using private attributes that might break without warning.
Strangely, this doesn't give the report until after the sleep finishes... ?
#!/usr/bin/python
# deferreds work fine without the reactor
import time
import twisted.internet.defer
twisted.internet.defer.setDebugging(True)
def functionReturningDeferred():
return twisted.internet.defer.succeed('Some value')
d = functionReturningDeferred()
def printValue(value):
print 'Yay, I got %r' % value
return value
def second_callback(value):
print 'still %r' % value
return gen_error()
def third_callback(value):
print 'and still %r' % value
#raise AssertionError
return value
def gen_error():
return twisted.internet.defer.fail(AssertionError)
def got_error(value):
print 'bad thing: %r' % value
d.addCallback(printValue)
d.addCallback(second_callback)
d.addCallback(third_callback)
d._debugInfo._getDebugTracebacks()
print
time.sleep(10)
#d.addErrback(got_error)