[Twisted-Python] Tracebacks being dropped from exceptions when using inlineCallbacks

glyph at divmod.com glyph at divmod.com
Sat Jan 17 03:18:40 EST 2009


On 07:54 am, glyph at divmod.com wrote:
>2. When filing that ticket, I'd really like a full working example of 
>inlineCallbacks not showing a traceback to play with

Just to drive that point home, Terry, I found an interesting error in 
your initial example.  Your example does this:

        info = sys.exc_info()
        f = failure.Failure(*info)

but sys.exc_info() is a tuple of (type, value, traceback), whereas 
Failure takes a tuple of (value, type, traceback).  This is why the 
default behavior of Failure() with no arguments is to capture the 
current exception.

Creating an invalid Failure, as you do here, has some _very_ weird 
ramifications for the low-level error-formatting code in the guts of the 
logging system; the reason the traceback doesn't get logged is due to an 
exception where your ZeroDivisionError instance doesn't have a 
__module__ attribute (since it's in the "type" slot).

If I modify your example to pass the arguments in the correct order, 
like so:

    import sys
    from twisted.internet import defer
    from twisted.python import failure

    d = defer.Deferred()
    try:
        1 / 0
    except Exception:
        exc_type, exc_value, exc_tb = sys.exc_info()
        f = failure.Failure(exc_value, exc_type, exc_tb)
        print "f.tb is %r" % f.tb
        d.errback(f)
        print "f.tb is %r" % f.tb

then I get a nice traceback, like this:

    f.tb is <traceback object at 0xb7c628c4>
    f.tb is None
    Unhandled error in Deferred:
    Traceback (most recent call last):
      File "example.py", line 10, in <module>
        f = failure.Failure(exc_value, exc_type, exc_tb)
    --- <exception caught here> ---
      File "example.py", line 7, in <module>
        1 / 0
    exceptions.ZeroDivisionError: integer division or modulo by zero

which is exactly what Failure is designed to do, i.e. produce useful 
tracebacks once the actual "traceback" instance is gone.

So, we still have some diagnosis to do on why you don't seem to be 
getting useful tracebacks from inlineCallbacks :).  Now, not only can I 
not reproduce the bug, your reasoning doesn't make sense any more 
either.




More information about the Twisted-Python mailing list