Generator return() and exceptions

Allen Wirfs-Brock allen at
Wed Jul 23 10:52:07 PDT 2014

On Jul 23, 2014, at 9:51 AM, Andy Wingo wrote:

> On Wed 23 Jul 2014 18:19, Allen Wirfs-Brock <allen at> writes:
>> On Jul 23, 2014, at 1:25 AM, Andy Wingo wrote:
>>    The TC39 notes do not record any discussion of return() causing an
>>    exception to be thrown.
>> In the latest ES6 draft for-of propagates any exceptions thrown by the
>> call to return(). See
>> forin-div-ofbodyevaluation step 3.k.ii.1-2 
>> As a matter of design policy we rarely, if ever, just drop exceptions.
> I probably didn't explain myself completely; apologies.  I meant that
> the mechanism of iter.return() should be implemented by throwing an
> exception (i.e., as if by "iter.throw(new StopIteration)") instead of
> "returning" from the yield point.

Well, in ES6 we don't define iterator termination in terms of a StopIteration exception.

However, both gen.throw and gen.return are specified in terms of abnormal completion of a yield: 
so they both unwind in a similar manner.


function gen() {
    try {
       while (true) {
           try {yield foo()
           } catch (e) {
              throw (e);
    } finally {

var  g = gen();;
g.throw(new Error);  //logs: throw, unwind
var h = gen();;
h.return(); //logs: unwind

Now that we have return() it isn't clear to me that we actually need throw() or whether for-of/yield* should call throw() like they currently do.

This is something I hope to discuss at the upcoming TC39 meeting.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the es-discuss mailing list