[Python-Dev] GeneratorExit inheriting from Exception
Raymond Hettinger
python at rcn.com
Sat Mar 25 19:12:26 CET 2006
>> I can't see all that much use for GeneratorExit in code that needs to
>> be compatible with 2.4, since the rest of the machinery that makes
>> exception handling around yield feasible doesn't exist.
>
> I agree entirely - my goal is to make sure it stays that way.
>
> The kind of code I'm talking about would be an *existing* Python 2.4 generator
> that happens to do something like:
>
> def gen(tasks):
> """yield the results of a bunch of task functions"""
> for task in tasks:
> try:
> yield (task, task())
> except Exception, ex:
> yield ExceptionOccurred(task, ex)
>
>
> If you run such a generator on Python 2.5, but don't run it to completion
> before it is garbage collected, you will get an error message printed on
> stderr saying that an exception was ignored when this generator was cleaned
> up. If you use the new PEP 342 features to try to explicitly close it before
> it is garbage collected, you'll get the exception directly.
>
> The culprit is the RuntimeError raised when the generator's close() method
> gets upset because the generator swallowed GeneratorExit.
>
> If GeneratorExit inherits directly from BaseException, such unexpected
> behaviour won't happen - the only way for an existing generator to break is if
> it contained a bare except clause, and that code was *already* dubious (e.g.
> it probably swallowed KeyboardInterrupt).
>
> I don't have any actual live examples of a generator with a broad exception
> clause like the one above, but toy generators like the one above are legal in
> 2.4 and result in spurious errors with current SVN.
I can't say that I care enough about this hypothetical inter-version flimflam to
warrant mucking-up the otherwise useful distinction between Exception and
BaseException.
special-cases-aren't-special-enough ...
Raymond
More information about the Python-Dev
mailing list