[ python-Bugs-1337990 ] doctest mishandles exceptions raised within generators

SourceForge.net noreply at sourceforge.net
Mon Apr 24 04:13:58 CEST 2006


Bugs item #1337990, was opened at 2005-10-25 22:18
Message generated for change (Comment added) made by tim_one
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1337990&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
>Category: Documentation
Group: None
>Status: Closed
>Resolution: Fixed
Priority: 5
Submitted By: Tim Wegener (twegener)
>Assigned to: Nobody/Anonymous (nobody)
Summary: doctest mishandles exceptions raised within generators

Initial Comment:
If a generator raises an exception while iterating over it, doctest 
will only register the exception output, and will miss output that 
occurred during previous loop iterations.

The following code clarifies and reproduces the problem:
(also included as an attachment)

"""Reproduce bug with exceptions in a generator in doctest tests.

This bug has been seen to occur in:

Linux (RH9):
Python 2.4.1
Python 2.3.5
Python 2.2.2 (using from __future__ import generators)

Windows XP:
Python 2.4.2
Python 2.3.5

"""

def error_generator():
    """Yield 0 to 2 and then try and raise an exception.

    >>> for j in error_generator():
    ...    print j
    0
    1
    2
    Traceback (most recent call last):
    Exception: Contrived exception for sake of example

    """
    # Note: This is obviously a contrived example of generator use.
    for i in range(3):
        yield i

    if 1:
        raise Exception("Contrived exception for sake of example")

    raise StopIteration


if __name__ == '__main__':
    # Run the doctest tests.
    import sys
    import doctest
    doctest.testmod(sys.modules['__main__'])

    print
    print 'What should have happened...'
    for j in error_generator():
        print j
    


----------------------------------------------------------------------

>Comment By: Tim Peters (tim_one)
Date: 2006-04-23 22:13

Message:
Logged In: YES 
user_id=31435

doctest doesn't support mixing "expected normal output" with
an exception, regardless of how such a thing may arise.  For
example, this one-liner can't work either as a doctest:

>>> print 'hi', 1/0
hi
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

So there's nothing specific to generators in this, rather
it's a doctest limitation.  The docs do say, wrt testing
exceptions:

"""
No problem, provided that the traceback is the only output
produced by the example:  just paste in the traceback.
"""

In any case, it wasn't intended that doctest support this,
and the docs do try to communicate that.  I added text
spelling out the other half (if there's expected output in
addition to the traceback, problem ;-)), in rev 45677 on the
trunk and rev 45678 on the 2.4 branch, and am closing this
report as a doc bug.

Edward Loper tried supporting this, as a new feature, before
2.4 was released, but it so grossly complicated the docs and
the implementation that we agreed to drop it.  So you could
 re-open this as a feature request, but it's unlikely to change.


----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1337990&group_id=5470


More information about the Python-bugs-list mailing list