[Twisted-Python] Unhandled error in Deferred with twisted-8.2.0, but not with twisted-2.1.0

Rutt, Benjamin Benjamin.Rutt at gs.com
Fri Jun 26 15:08:39 EDT 2009


Thank you for digging this up - I filed a bug.  

http://twistedmatrix.com/trac/ticket/3892

-----Original Message-----
From: twisted-python-bounces at twistedmatrix.com
[mailto:twisted-python-bounces at twistedmatrix.com] On Behalf Of
glyph at divmod.com
Sent: Friday, June 26, 2009 1:49 PM
To: Twisted general discussion
Subject: Re: [Twisted-Python] Unhandled error in Deferred with
twisted-8.2.0,but not with twisted-2.1.0


On 04:33 pm, benjamin.rutt at gs.com wrote:
>Am currently trying to upgrade to twisted-8.2.0.  For some reason,
>twisted-8.2.0 thinks my deferred below was gc'd with an unhandled 
>error,
>and tells me about it upon reactor exit.  With
>python-2.4.2/twisted-2.1.0, no issues.  With 
>python-2.6.1/twisted-8.2.0,
>I see these issues.  Any ideas why?  Thanks.

A second Deferred is created during getProcessOutput to track the ending

of the process as distinct from the end of its output.  You have to 
catch that exception as well if you don't want any exceptions logged.

Arguably, this is a bug, since it changes the behavior and complicates 
error handling; if you think so, feel free to file a ticket on the 
tracker.  I just learned about this behavior myself, in the process of 
tracking down your question :).

This behavior was changed in:

    http://twistedmatrix.com/trac/changeset/24810

as part of a fix for:

    http://twistedmatrix.com/trac/ticket/3239

and that took place after 8.1 but before 8.2.  In the meanwhile, you 
could upgrade to 8.2 before going to 8.2 to avoid this issue; going from

8.1 to 8.2 should be significantly easier than going from 2.1 to 8.1 ;).

If you'd still like to upgrade all the way, here's a "correct" version 
of your program (with spurious imports removed), according to the 
behavior in 8.2.0:

#!/usr/bin/env python
from twisted.internet import reactor
from twisted.internet.utils import getProcessOutput

def foo():
    d = getProcessOutput('/some/non/existent/program')
    def cb(result):
        print 'cb: %s' % (result)
    def eb(failure):
        failure.trap(IOError)
        def endedException(ended):
            print 'really, caught it!'
        failure.value.processEnded.addErrback(endedException)
        print 'eb caught the failure!'
    d.addCallback(cb)
    d.addErrback(eb)

def stopit():
    print 'Stopping reactor.'
    reactor.stop()
    print 'Stopped.'

reactor.callWhenRunning(foo)
reactor.callLater(1.0, stopit)
reactor.run()

_______________________________________________
Twisted-Python mailing list
Twisted-Python at twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python




More information about the Twisted-Python mailing list