<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jul 23, 2014, at 1:25 AM, Andy Wingo wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Hi,<br><br>The TC39 notes do not record any discussion of return() causing an<br>exception to be thrown.<br></div></blockquote><div><br></div><div>In the latest ES6 draft for-of propagates any exceptions thrown by the call to return(). See <a href="http://people.mozilla.org/~jorendorff/es6-draft.html#sec-runtime-semantics-forin-div-ofbodyevaluation">http://people.mozilla.org/~jorendorff/es6-draft.html#sec-runtime-semantics-forin-div-ofbodyevaluation</a> step 3.k.ii.1-2  </div><div><br></div><div><br></div><div>As a matter of design policy we rarely, if ever, just drop exceptions.</div><div><br></div><div><br></div><blockquote type="cite"><div><br>I understand that one of the concerns was about guards and catch blocks,<br>but making return() throw an exception does not affect that in the<br>least.<br><br>It's already the case that any catch block may see any old exception.<br>Adding a new kind of exception doesn't affect that; properly written<br>catch blocks have to test the positive presence of the exception they<br>are looking for, not the absence of exceptions they aren't interested<br>in.  Magical return() is no better here because, as you note, return can<br>be caught too.<br><br>There are valid cases in which you can have a catch without a guard;<br>these are when can enumerate the possible exceptions that a part of your<br>program will throw.  However this condition necessarily limits the size<br>of the try{} block -- it is unlikely to contain a yield.  So no problem<br>there either.<br></div></blockquote><div><br></div><div>It's not exactly clear to me what your point is here.  If you want to catch any exception (including those originating from a return() call to  the iterator) that can occur within while executing a for-of statement you would code:</div><div><br></div><div>try {</div><div>  for (let each of expr) {...}</div><div>} catch (e) {... };</div><div><br></div><div>If you only want to catch exceptions from the for-of body you would code:</div><div><br></div><div>for (let each of expr) {</div><div>   try { ...</div><div>  }  catch (e) { ...};</div><div>}</div><div>   </div><div><br></div><div>Allen</div><div><br></div><div><br></div><div><br></div></div></body></html>