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)