[Python-ideas] Yield-From: Finalization guarantees

Jacob Holm jh at improva.dk
Mon Mar 30 00:21:19 CEST 2009


Nick Coghlan wrote:
> Jacob Holm wrote:
>   
>> The problem is that any exception thrown into inner is converted to a
>> GeneratorReturn, which is then swallowed by the yield-from instead of
>> being reraised.
>>     
>
> That actually only happens if inner *catches and suppresses* the thrown
> in exception. 
Having a return in the finally clause like in my example is sufficient 
to suppress the exception.

> Otherwise throw() will reraise the original exception
> automatically:
>   
I am not sure what your point is.  Yes, this is a corner case.  I am 
trying to make sure we have the corner cases working as well.

In the example I gave I think it was pretty clear what should happen 
according to the inlining principle.  The suppression of the initial 
exception is an accidental side effect of the refactoring.  It looks to 
me like using the __cause__ attribute on the GeneratorReturn will allow 
us to reraise the exception.  This seems like exactly the kind of thing 
that the __cause__ and __context__ attributes from PEP 3134 was designed 
for. 

- Jacob



More information about the Python-ideas mailing list