Repository navigation
doctest mishandles exceptions raised within generators #42523
Description
Activity
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 iif 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 jLogged In: YES
user_id=31435doctest 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.
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields: