[Python-Dev] SF #1462485 - StopIteration raised in body of 'with' statement suppressed
Guido van Rossum
guido at python.org
Mon Apr 3 17:41:43 CEST 2006
On 4/2/06, Delaney, Timothy (Tim) <tdelaney at avaya.com> wrote:
> Given:
>
> @contextmanager
> def gen():
> print '__enter__'
> yield
> print '__exit__'
>
> with gen():
> raise StopIteration('body')
>
> I would expect to get the StopIteration exception raised. Instead it's
> suppressed by the @contextmanager decorator.
Right. I'm not sure how to fix this (but I think Phillip probably can).
> I think we should only suppress the exception if it's *not* the
> exception passed into gen.throw() i.e. it's raised by the generator.
> Does this sound like the correct behaviour? I've attached tests and a
> fix implementing this to the bug report.
Cool.
> I can't confirm right now (at work, need to install 2.5) but I'm also
> wondering what will happen if KeyboardInterrupt or SystemExit is raised
> from inside the generator when it's being closed via __exit__. I suspect
> a RuntimeError will be raised, whereas I think these should pass
> through.
I see no reason for this with the current code. Perhaps a previous
version of contextlib.py had this problem?
--
--Guido van Rossum (home page: http://www.python.org/~guido/)
More information about the Python-Dev
mailing list