ImageImage

This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: doctest mishandles exceptions raised within generators
Type: Stage:
Components: Documentation Versions:
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: tim.peters, twegener
Priority: normal Keywords:

Created on 2005-10-26 02:18 by twegener, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
doctest_generator_bug.py twegener, 2005-10-26 02:18 Code to reproduce doctest bug
Messages (2)
msg26710 - (view) Author: Tim Wegener (twegener) Date: 2005-10-26 02:18
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
    
msg26711 - (view) Author: Tim Peters (tim.peters) * (Python committer) Date: 2006-04-24 02:13
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.
History
Date User Action Args
2022-04-11 14:56:13adminsetgithub: 42523
2005-10-26 02:18:27twegenercreate